3、Linux用户管理与权限相关
Linux用户管理与权限相关
ACL相关介绍:https://www.ibm.com/developerworks/cn/linux/l-acl/
一、su、sudo与sudoers权限管理
http://linux.vbird.org/linux_basic/0410accountmanager.php#shadow_file
1、普通用户
2、超级管理员 root
使用su进行用户切换时,加 - 和不加 - 是有很大区别的,加 - 是以切换的用户的login_shell登录,环境变量的资源都准确的是刚切换的用户的;而不加 - 只改变一小部分资源,大部分还是原来用户的。
su 和 sudo的区别?
su是switch user,如果是切换root,就需要使用超级管理员root的密码
sudo是暂时使用某用户的权限进行操作,一般使用超级管理员权限,但是只有在/etc/sudoers名单中的用户才能使用,使用时输入的的是当前用户的密码而非超级管理员密码。
sudo的时间有效期:两次sudo命令5分钟以内就不用再次输入密码。
/etc/sudoers的编辑方法:使用visudo
命令编辑,如果有语法问题会报错。
/etc/sudoers设置权限的方法:
账号/组名 | 主机名 | 可切换的身份 | 可下达的命令(绝对路径)
用户:
user ALL=(ALL) ALL
组:
%group ALL=(ALL) ALL
给用户设置某个指令的方法:
user ALL=(ALL) !/usr/bin/passwd,!/usr/bin/passwd root,/usr/bin/passwd root
#使用户只能帮忙修改密码,但是不能修改root的密码不需要密码使用sudo:
user ALL=(ALL) NOPASSWD: ALL
除了组可以统一规范多个用户的行为以外,还可以使用变量/别名的方式
1
2
3
4 [root@study ~]# visudo <==注意是 root 身份
User_Alias ADMPW = pro1, pro2, pro3, myuser1, myuser2
Cmnd_Alias ADMPWCOM = !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root
ADMPW ALL=(root) ADMPWCOM
二、/etc/shadow,/etc/passwd, /etc/group文件分析
用户名 | 密码密文 | 密码最近一次修改时间(1970.1.1起的相对天数)| 密码修改后多少天后才可以再修改 | 密码有效期 | 密码过期前提前几天进行警告 | 密码宽限时间(过期后登录会强制修改密码,过了宽限时间密码会失效,只能联系root进行操作)| 最终失效期(即使修改了密码也会失效,就是账户的寿命,比如可以用作收费授权)
SHA512加密,且使用了salt值一起加密,密码字段有三段$6$salt$密文,详情见鸟哥。
三、用户管理相关操作命令
Linux的用户是先有组后有用户,当创建用户没有指定基本组时,逻辑是先创建一个和用户名相同的组,然后该用户的基本组被默认设置为用户名相同的组。
用户创建管理等相关默认配置信息:/etc/login.defs,修改此文件可从根本打破linux的默认用户相关创建规则。
groupXXX:
增加组并指定组号:groupadd -g 组号 组名
修改组号:groupmod -g 新组号 组名
删除组:groupdel 组名
userXXX:
增加用户并指定基本组和附加组:useradd -g 基本组 -G 附加组 新用户名
添加用户并指定无家目录:useradd -M 用户名
添加用户并设置shell:useradd -s shell程序(如/sbin/nologin)用户名
设置用户的附加组与修改用户UID:usermod -G 附加组号 -u UID号 用户名
删除用户(连同家目录一起删除):userdel -r 用户名
passwd:
设置用户密码:passwd 用户名
(密码四分之三原则,大小写、特殊字符、长度6位以上)
将用户密码进行锁定,无法登录(在shadow密码前加了!!):passwd -l(lock) 用户名
将用户密码进行解锁:passwd -u 用户名
查看用户的passwd状态:passwd -S 用户名
gpasswd:
将用户从组中删除:gpasswd -d user 组
chage:
设置用户密码有效期:chage -M 天数 用户名
设置用户下次登录必须修改密码:chage -d 0 用户名
四、Linux权限
查看目录权限的命令:ls -ld 目录名
第一段是文件类型和权限
1
2
3
4
5 文件类型:d目录、-二进制、b块设备、c字符设备...
权限三段rwx分别是主、组和其他用户的读r、写w、执行权限位x
r w x
文件:可读取文件 可修改文件内容 可执行文件
目录:可查看目录内容 可增删文件 可以进入目录第二段是如果是目录就表示目录中的子目录数;如果是文件就是节点/硬链接数(深入讲就是硬盘里该部分数据在文件系统中的关联节点数)
第三段是文件属主
第四段是文件属组
第五六七段是最新修改时间
第八段是文件名
第九段我称其为安全权限位:如果使用了ACL就是
+
,如果开启了selinux每一个文件这个位置都是.
,表示有selinux相关的安全上下文,使用getfacl 文件名
可以查看。
修改文件权限的命令:chmod 用户 算术运算符 权限 文件
用户:u(所属者) g(所属组) o(其他用户) a(所有人)
算术运算符:+ - =
权限:r、w、x、s(SGID/SUID)、t(SBIT)
修改文件的所属者:chown 用户名 文件
修改文件的所属组:chgrp 组名 文件
五、Linux特殊的权限
1、粘滞位(Sticky Bit)/SBIT:粘滞位权限只能针对目录文件赋权,目录中创建的文件只有建立者可以删除。该权限位一般用于系统运行生成临时文件的目录,例如/tmp,以防止其它坏蛋删除临时文件,影响系统运行。chmod o+t
在使用8进制表示的权限中,1XXX就表示特殊权限粘滞位SBIT的赋权。
当权限位 t 是大写 T 时,说明此处无 x 权限。(SBIT占用x权限位)
2、SGID(Set-GID):SGID权限只能针对目录文件赋权,在该目录下建立的文件所属组继承父目录的属组。
在使用8进制表示的权限中,2XXX就表示特殊权限粘滞位SGID的赋权。
当权限位 s是大写 S 时,说明此处无 x 权限。(SGID占用x权限位)
3、SUID(Set-UID):SUID权限只能针对文件赋权,一般针对可执行文件,在运行这个可执行文件后创建的进程的操作权限和文件属主相同/或者说进程的euid赋值为文件属主的uid。
可想而知,具有SUID的root属主可执行文件是很危险的,一旦对这种进程成功攻击,则会拿到root的权限,因此对于SUID进程,linux很多程序都有相关的保护措施,比如代码中常用的system函数,它的原理是通过/bin/sh -c command来执行命令的,在Ubuntu16.04/12.04中/bin/sh软链接指向/bin/dash,而dash就实现了一个保护机制,当它发现自己在一个Set-UID进程中运行时,会将有效用户IDeuid转变为真实用户IDruid,主动放弃特权,防止权限泄露。
在使用8进制表示的权限中,4XXX就表示特殊权限粘滞位SGID的赋权。
当权限位 s是大写 S 时,说明此处无 x 权限。(SUID占用x权限位)
查找SUID程序的方法:find 文件夹 -perm 4XXX/2XXX/1XXX
六、修改文件属性
增加文件不可变的属性:chattr +i /etc/passwd /etc/shadow
让某个文件只能往里面追加数据,但不能删除,适用于各种日志文件:chattr +a /var/log/messages
查看文件的属性:lsattr /etc/passwd /etc/shadow
七、创建文件的默认权限
root和普通用户创建文件和目录的权限都不相同。
Linux认为目录的最高权限是0777、文件的最高权限是0666(因为不是所有文件都可以执行)
因此umask就是针对目录和文件的最高权限进行计算的。root的umask是0022;UID>199且UID==GID的umask时002
一般推荐umask为027。
修改umask的方法:
1、临时修改:只需umask 新的值
2、永久修改:/etc/profile(用户第一次登陆时执行) 在64行左右有一个对umask判断赋值的语句,判断是否UID大于199并且UID==GID,如果是,则umask002,否则umask022。可进行修改。/etc/bashrc (用户每次登录bash时执行),也要改。小心权限修改影响业务。