linux的权限控制

1,419 阅读13分钟

概述

Linux 权限控制是一种在 Linux 操作系统中对访问文件和目录进行限制和管理的机制

在Linux系统中,文件和目录的访问权限是由读(r)、写(w)和执行(x)三种基本权限组成的。针对每种权限,系统管理员或文件所有者可以通过命令进行精确的分配和控制。例如,一个文件的拥有者可以设置该文件为自己可读写,而其他用户可能仅有读取权限或者没有任何权限。这种基于权限的访问控制机制确保了系统的安全性和数据的私密性。

用户和用户组

了解Linux的用户和用户组是理解其权限管理的基础。Linux系统中有两种用户:超级用户(root)和普通用户。超级用户几乎可以在系统中做任何事情,没有限制;而普通用户的权限则受到限制。用户可以在系统内切换身份,比如从普通用户切换到超级用户,这通常需要超级用户的密码。此外,每个文件都有一个所有者和一个所属组,这些信息决定了哪些用户可以访问这个文件。

用户

cat  /etc/passwd 

查看系统用户信息,里面包含了系统每一个用户对应的用户组,用户对应的目录等信息

image.png 每个用户对应一行,每一行记录者用户的信息,以”分隔,总共 7个字段

其格式和具体含义如下:

用户名 : 口令 : 用户标识号 : 组标识号 : 注释性描述 : 主目录 : 登录 Shell

  • 用户名:如果该用户登录shell是/sbin/nologin表示该用户不能登录,对应的在/etc/shadow中的密码也是*号表示,
  • 口令:口令都是脱敏的,用x 表示,真正的加密后的用户口令字存放到/etc/shadow里,后面会详细介绍这个文件

常用命令:

  1. 创建用户并设置初始权限
    • 创建用户:使用useradd命令来创建一个新的用户。这个命令需要root权限,可以指定用户的家目录、登录shell以及初始用户组。例如,sudo useradd -d /home/newuser -m newuser会创建一个新用户并为其设置家目录为/home/newuser。
    • 设置密码:每个新用户都需要一个密码,这可以使用passwd命令来完成。例如,sudo passwd newuser会提示您为新用户设置密码。
  2. 修改用户属性
    • 用户 shell 更改:使用usermod命令更改用户的登录shell。例如,sudo usermod -s /bin/bash newuser将用户的登录shell更改为Bash。
    • 设置主要用户组:可以修改用户的主要用户组,使用usermod命令的-g选项。例如sudo usermod -g newgroup newuser会将新用户的主要用户组更改为newgroup。
  3. 添加用户到附加组
    • 附加组权限:在Linux中,一个用户可以属于多个组,这些组可以是附加组。要添加用户到附加组,使用usermod的-G选项。例如sudo usermod -G group1,group2 newuser会将新用户添加到group1和group2这两个附加组。
  4. 设置文件和目录权限
    • 文件属主及属组更改:使用chown命令更改文件或目录的属主和属组。例如,sudo chown newuser:group1 /path/to/file会将指定文件的属主更改为newuser,属组更改为group1。
    • 权限设定:使用chmod命令来更改文件或目录的权限。例如,sudo chmod 754 /path/to/file会为文件设置属主可读可写可执行(7)、属组可读可执行(5)、其他用户仅可读(4)的权限。
  5. 管理用户登录和环境限制
    • 登录 Shell 限制:如果需要限制用户不能直接登录系统,可以将其登录Shell设置为/sbin/nologin或/usr/sbin/nologin。例如,sudo usermod -s /sbin/nologin newuser。
    • 环境变量和 PATH 设置:在用户的.profile或.bashrc文件中,可以自定义环境变量和PATH设置,以限制用户可执行的程序路径和具备的环境变量。

用户组

用户组可以简化系统管理, 可以用来模拟公司的部门和团队结构,使得权限管理更加贴近实际工作流程。

也是由冒号(:)隔开若干个字段,这些字段具体如下

组名 : 口令 : 组标识号 : 组内用户列表

image.png

常用命令:

  1. 创建和修改用户组
    • 创建用户组:使用groupadd命令可以创建一个新的用户组。这个命令的基本语法是groupadd 用户组名。
    • 修改用户组属性:如果需要修改已有用户组的属性,可以使用groupmod命令。例如,可以改变用户组的名称或GID。
    • 删除用户组:当某个用户组不再需要时,可以通过groupdel命令来删除。注意,主组依赖于用户存在而存在,只有当用户不存在时,主组才会被删除。
  2. 向用户组添加用户
    • 添加用户到用户组:usermod命令可以用来把用户添加到一个或多个用户组。使用选项-aG可以把这些用户添加到附加的用户组中,而-g选项则用来指定用户的主组。
    • 查看用户所属组:通过执行groups 用户名可以查看特定用户属于哪些用户组。
    • 删除用户组中的用户:可以从用户组中移除用户,这同样使用usermod命令,但是需要从组列表中删除指定的用户名称。
  3. 为用户组分配文件权限
    • 修改文件的所属组:chgrp命令允许改变文件或目录的所属组。基本格式为chgrp 用户组名 文件名。使用-R选项可以递归地更改指定目录及其子目录下所有文件和目录的所属组。
    • 设置文件的组权限:文件或目录的权限可以通过chmod命令来设置。对于组权限,可以使用符号模式如chmod 760 文件名,这样设置后文件所属组的用户将具有读和写的权限。
    • 递归设置权限:在目录上使用chmod和chgrp命令时,加上-R参数可以确保更改应用到目录中的所有文件和子目录。
  4. 管理用户组权限
    • 批量管理权限:通过结合使用chown, chgrp, 和 chmod命令,系统管理员可以轻松地为用户组批量设置和管理文件权限。这特别适用于需要为多个用户提供相似访问级别的情景。
    • 安全考虑:在为用户组分配权限时,必须考虑到安全性问题。避免给不必要的用户组过多的权限,以免造成数据泄露或其他安全问题。
    • 使用 sudo 为组赋予特权:在某些情况下,可以配置sudoers文件,使得属于特定用户组的用户能够以更高的权限(如root)运行某些命令。这能够在不直接提供root权限的情况下,方便用户执行需要较高权限的任务。

密码

加密密码

如果密码字符串为*,则表示系统用户不能被登入;如果字符串为!,则表示用户名被禁用;如果字符串为空,则表示没有密码。双叹号表示这个密码已经过期了;

如果通过useradd添加的用户,未指定密码,密码这一栏就是!!

由三部分组成的,即:

$id$salt$encrypted

【注】:

  • id为1时,采用md5进行加密;
  • id为2时,采用Blowfish加密;
  • id为5时,采用SHA256进行加密;
  • id为6时,采用SHA512进行加密;

以如下为例:

$1$bcNAfdEt$3A62MM5GrWogCQDpcX/3q.

表示采用md5加密,盐值为bcNAfdEt,加密后的密文为3A62MM5GrWogCQDpcX/3q.

public static void main(String[] args){
    String md5 = getMD5("xxxxx", "bcNAfdEt");
    System.out.println(md5);
    byte[] encode = Base64.getEncoder().encode(md5.getBytes());
    System.out.println(new String(encode));
    System.out.println(new String(Base64.getDecoder().decode("3A62MM5GrWogCQDpcX/3q")));
}


public static String getMD5(String input, String salt) {
    try {
        MessageDigest md = MessageDigest.getInstance("MD5");
        md.update(input.getBytes());
        md.update(salt.getBytes());
        byte[] digest = md.digest();
        return bytesToHex(digest);
    } catch (NoSuchAlgorithmException e) {
        throw new RuntimeException("NoSuchAlgorithmException", e);
    }
}

private static String bytesToHex(byte[] bytes) {
    StringBuilder hexString = new StringBuilder();
    for (byte b : bytes) {
        String hex = Integer.toHexString(0xff & b);
        if (hex.length() == 1) {
            hexString.append('0');
        }
        hexString.append(hex);
    }
    return hexString.toString();
}

经过MD5加盐后的密文不对,这块存疑?

密码复杂度设置

为了增强系统安全性,可以通过设置密码复杂度来限制用户设置密码的规则。密码复杂度通常包括以下几个方面的要求:

  1. 密码最小长度:规定密码的最少字符数,通常建议设置为8个字符以上。
  2. 包含特定类型的字符:要求密码中必须包含小写字母、大写字母、数字和特殊字符中的至少一种或多种。
  3. 避免常见密码:禁止用户使用过于简单或常见的密码,以增加密码的复杂性。

在Linux系统中,可以通过修改PAM(Pluggable Authentication Modules)的配置文件来设置密码复杂度。具体的配置文件可能因发行版而异,但通常位于/etc/pam.d/目录下,例如common-password。

通过编辑配置文件,可以添加或修改密码复杂度相关的行,例如:

password requisite pam_pwquality.so minlen=8 dcredit=-1 ucredit=-1 ocredit=-1 lcredit=-1

上述配置要求密码最小长度为8个字符,并至少包含一个小写字母(dcredit)、一个大写字母(ucredit)、一个数字(ocredit)和一个特殊字符(lcredit)。可以根据实际需求调整这些参数。

附加权限

Linux 附加权限是 Linux 文件系统中除了基本权限(读、写、执行)之外的额外权限设置,包括 set 位权限( suid sgid )和粘滞位权限( sticky 。这些权限为文件和目录提供了额外的访问控制,以提高系统的安全性和灵活性具体介绍如下:

  1. set 位权限
    • SUID Set User ID :这种权限允许普通用户以文件所有者的身份执行特定程序。当一个设置SUID权限的可执行文件被运行时,任何用户都会获得文件所有者的临时身份,从而继承所有者的权限。例如,/usr/bin/passwd命令就设置了SUID,以便普通用户可以更改自己的密码,而这对root用户的权限是必需的。通过chmod命令添加,格式:chmod u+s 可执行的程序
    • SGID Set Group ID :SGID对文件和目录的作用稍有不同。对于文件,任何用户运行带有SGID权限的文件时,都会获得该文件所属组的身份。对于目录,如果目录设置了SGID权限,任何在该目录下创建的新文件或目录自动继承该父目录的所属组。这种权限常用于需要共享文件和目录的环境中,以确保所有成员可以共同编辑和管理文件。通过chmod命令添加,格式:chmod g+s 目录
  2. 粘滞位权限
    • Sticky Bit:粘滞位权限通常用于公共目录,如/tmp。当目录设置了粘滞位权限,即使用户拥有对该目录的写权限,也不能删除其他用户的文件。这可以防止恶意用户删除或篡改他人的文件。在权限表示中,如果一个目录设置了粘滞位权限且其他用户权限中包含执行权限,则执行权限位会显示为t;如果没有执行权限,则显示为T。
  3. 附加权限的应用
    • 使用场景:SUID和SGID常用于需要提升权限以完成任务的程序,如passwd用于更改用户密码,需要临时提升权限以访问系统用户信息。粘滞位权限则常用于保护公共目录中的文件不被非法删除。
    • 安全性考虑:虽然附加权限提供了便利和额外的安全层,但它们也可能带来潜在的安全风险。如果滥用SUID和SGID,可能会意外提升普通用户的权限,从而影响系统安全。因此,在设置这些权限时应谨慎并进行适当的安全评估。

高级权限管理

ACL (访问控制列表)

Linux ACL Access Control List )的相关指令主要包括 getfacl setfacl ,用于查看和设置文件或目录的访问控制列表。 这些指令为系统管理员提供了更细粒度的权限管理手段,具体介绍如下:

  1. getfacl 命令
    • 功能:getfacl命令用于显示文件或目录的ACL(访问控制列表)。通过这个命令,可以查看针对特定用户、组或其它身份的访问权限。
    • 用法示例:查看/project目录的ACL权限:getfacl /project。该命令会输出包括所有者、属组、其他用户以及通过ACL额外定义的任何特定用户或组的权限。
  2. setfacl 命令
    • 功能:setfacl命令用于修改文件或目录的ACL权限。它可以添加、删除或修改特定用户或组的访问权限,比传统的chmod命令提供更灵活的权限管理方式。
    • 用法示例:给用户st添加对/project目录的读和执行权限:setfacl -m u:st:rx /project。这里,-m选项表示修改ACL,u:st:rx指定了用户st及其权限(读和执行)。
  3. ACL 权限的默认设置
    • 默认 ACL:在目录上设置默认ACL权限,确保在此目录下新创建的文件或子目录自动继承特定的权限设置。这通过使用setfacl命令的-d选项实现。
    • 用法示例:为/project目录设置默认ACL,使得新创建的文件自动赋予用户st读权限:setfacl -d -m u:st:r /project。
  4. 删除或修改 ACL 规则
    • 删除特定 ACL 规则:使用setfacl的-x选项可以删除特定的ACL规则。例如,移除用户st对/project的访问权限:setfacl -x u:st /project。
    • 修改 ACL 规则:可以通过重新应用新规则来修改现有的ACL权限,这通常涉及先删除再添加相同用户或组的新规则。
  5. ACL 权限的递归设置
    • 递归设置:使用setfacl的-R选项可以递归地对目录及其内的所有子文件和子目录设置或修改ACL权限。这在需要对整个目录树应用统一权限策略时非常有用。

    • 用法示例:递归设置/project目录及其所有子项的ACL,使用户st拥有读权限:setfacl -R -m u:st:r /project。

参考

linux etc下 passwd、shadow和group文件详解-腾讯云开发者社区-腾讯云 (tencent.com)

Linux shadow文件中密码的加密方式 - gxy* - 博客园 (cnblogs.com)

HMAC哈希加密,支持 HMAC MD5/SHA1/SHA256/SHA512 加密算法 - 在线工具-wetools.com微工具

Linux系统中的用户管理与密码安全:passwd与shadow文件详解及密码复杂度设置 (baidu.com) 讯飞星火大模型-AI大语言模型-星火大模型-科大讯飞 (xfyun.cn)