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登录,环境变量的资源都准确的是刚切换的用户的;而不加 - 只改变一小部分资源,大部分还是原来用户的。

URunmT.png

su 和 sudo的区别?

su是switch user,如果是切换root,就需要使用超级管理员root的密码

sudo是暂时使用某用户的权限进行操作,一般使用超级管理员权限,但是只有在/etc/sudoers名单中的用户才能使用,使用时输入的的是当前用户的密码而非超级管理员密码。

URMyef.png

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 用户名

添加用户并设置shelluseradd -s shell程序(如/sbin/nologin)用户名

设置用户的附加组与修改用户UIDusermod -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时执行),也要改。小心权限修改影响业务。

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器