Linux权限管理的基本概念

Linux系统中的权限管理是保障系统安全的核心机制。每个文件和目录都有特定的权限设置,决定哪些用户或用户组可以对其进行读取、写入或执行操作。权限分为三类:

  1. 所有者权限(u):文件创建者拥有的权限
  2. 所属组权限(g):文件所属用户组成员拥有的权限
  3. 其他用户权限(o):系统中其他所有用户的权限

权限通过字符或数字表示:

  • 字符表示法:
    • r(read):读取权限
    • w(write):写入权限
    • x(execute):执行权限
  • 数字表示法(八进制):
    • 4对应读取
    • 2对应写入
    • 1对应执行
    • 通过数字相加组合表示权限(如7=4+2+1表示rwx)

查看文件和目录权限

使用ls -l命令可以详细查看文件或目录的权限信息。典型输出格式如下:

-rw-r--r-- 1 user group 1024 Jan 1 10:00 file.txt
drwxr-xr-x 2 user group 4096 Jan 1 10:00 directory/

权限字段分解:

  • 第1个字符:文件类型
    • -:普通文件
    • d:目录
    • l:符号链接
    • 其他特殊文件类型(如c,b,p,s等)
  • 后续9个字符:每3个一组分别表示所有者、所属组和其他用户权限
    • rwx:可读可写可执行
    • r--:仅可读
    • r-x:可读可执行

修改文件权限

chmod命令用于修改文件或目录的权限,支持两种修改方式:

  1. 字符方式(适合对现有权限进行增量修改):

    • 操作对象:
      • u:所有者
      • g:所属组
      • o:其他用户
      • a:所有用户
    • 运算符:
      • +:添加权限
      • -:移除权限
      • =:设置精确权限
    • 示例:
      1chmod u+x script.sh  # 为所有者添加执行权限
      2chmod go-w file.txt  # 移除组和其他用户的写入权限
      3chmod a=rw file.txt  # 设置所有用户为可读可写
  2. 数字方式(适合批量设置精确权限):

    • 用三位八进制数表示权限
    • 示例:
      1chmod 755 file.txt   # rwxr-xr-x
      2chmod 644 file.txt   # rw-r--r--
      3chmod 700 secret.txt # 仅所有者有全部权限

修改文件所有者和所属组

  1. chown命令:

    1chown user:group file.txt  # 同时修改所有者和所属组
    2chown user file.txt        # 仅修改所有者
    3chown :group file.txt      # 仅修改所属组
    • 常用选项:
      • -R:递归修改目录下所有文件
      • --reference=参照文件:使用参照文件的属性
  2. chgrp命令:

    1chgrp developers project/
    2chgrp -R staff /shared  # 递归修改

特殊权限设置

  1. SetUID(suid):

    • 作用:允许用户以文件所有者的身份执行文件
    • 典型应用:/usr/bin/passwd
    • 设置方法:
      1chmod u+s /usr/bin/special_program
      2chmod 4755 /usr/bin/special_program
    • 显示:在所有者执行位显示为s(如-rwsr-xr-x
  2. SetGID(sgid):

    • 目录应用:新创建的文件继承目录的所属组
    • 文件应用:以文件所属组的身份执行
    • 设置方法:
      1chmod g+s /shared/projects
      2chmod 2775 /shared/projects
    • 显示:在组执行位显示为s
  3. Sticky Bit

    • 作用:在共享目录中,只有文件所有者才能删除/重命名自己的文件
    • 典型应用:/tmp目录
    • 设置方法:
      1chmod +t /shared/upload
      2chmod 1777 /shared/upload
    • 显示:在其他用户执行位显示为t

默认权限设置

umask决定了新建文件和目录的默认权限:

  • umask值通过屏蔽权限位实现
  • 文件默认权限:666 - umask
  • 目录默认权限:777 - umask

查看当前umask:

1umask  # 通常显示0022或0002

设置umask:

1umask 0027  # 结果权限:文件640,目录750
2umask 0002  # 更宽松的设置

永久设置:可添加到~/.bashrc或/etc/profile中

ACL权限管理

ACL(Access Control List)提供更细粒度的权限控制:

  1. 查看ACL:

    1getfacl /shared/docs
  2. 设置ACL:

    1setfacl -m u:alice:rwx /shared/docs  # 为用户alice添加权限
    2setfacl -m g:developers:rw- /shared/docs
    3setfacl -x u:bob /shared/docs  # 移除bob的ACL条目
  3. 默认ACL(影响新建文件):

    1setfacl -d -m u:alice:rwx /shared/docs
  4. 递归设置:

    1setfacl -R -m u:alice:r-x /projects

实际应用场景

  1. Web服务器目录:

    1chown -R www-data:www-data /var/www
    2find /var/www -type d -exec chmod 755 {} \;
    3find /var/www -type f -exec chmod 644 {} \;
  2. 共享协作目录:

    1mkdir /shared/team
    2chgrp developers /shared/team
    3chmod 2775 /shared/team  # 设置SGID
    4setfacl -d -m g:developers:rwx /shared/team
  3. 用户私有目录:

    1chmod 700 /home/username
    2chmod 600 /home/username/.ssh/*

总结

Linux权限管理是一个层次化的安全体系:

  1. 基础权限:控制三类用户的基本访问
  2. 特殊权限:解决特定场景下的权限需求
  3. ACL:提供更精细的权限分配

最佳实践建议:

  • 遵循最小权限原则
  • 对敏感文件设置严格权限(如600)
  • 定期审计关键目录的权限设置
  • 在共享环境中合理使用SGID和Sticky bit
  • 对复杂权限需求使用ACL而非过度放宽基础权限