Linux系列04:用户和权限管理

用户和组

用户分为系统用户和普通用户,系统用户uid较小,普通用户uid在CentOS6中500开始,CentOS7中是1000开始。

用户配置文件/etc/passwd,密码文件/ets/shadow,组配置文件/etc/group,组密码文件/etc/gshadow。

用户配置文件中,各列依次是用户名,密码占位符,用户id,组id,注释,家目录,登陆shell

如果删除密码占位符,无需密码即可本地登陆。

用户密码配置文件中,各列依次是:用户名,密码,最后一次修改时间(1970-01-01至今的天数),最小修改时间间隔,有效期,警告天数,宽限天数,保留

密码字符串有三部分组成,用$分割,第一部分是加密方式,目前使用的6是sha-512,5是sha-256,1是md5,第二部分是salt,避免彩虹表攻击,使密码更安全,第三部分是crypt形式的哈希值

man 5 shadow可以查看配置文件的帮助信息,发现密码是由crypt函数生成的,yum install man-pages安装完整man手册,man 3 crypt可以查看该函数的详细信息。

密文使用了base64类似的编码方式,除26个字母大小写加数字,外加点和斜线,将base64中加号换成点,去掉等号,就是这个编码。URL中传输可以采用base58,比特币钱包就是这个编码。

手动生成一样的密码,各大编程语言都有crypt类库,下面以PHP为例手动生成

php -r 'echo crypt("111111","$6$3MkRYm8bvE9CS1t4$")."\\n";'

python -c 'import crypt; print crypt.crypt("111111","$6$3MkRYm8bvE9CS1t4$")'

$6$3MkRYm8bvE9CS1t4$YBvXOJlBWNa.Gnu5QT//tvleIgkIchPFV0A1J.dSwJtyCrG7mCLg2i08v4icJz9SvHB8zOra9DSEBmqDH4mIN0

与/etc/shadow中密码字段完全相同,换言之把上面的字符串复制到shadow文件密码字段,用111111就可以登陆了。

MD5编码也是可以的,使用openssl passwd -1 -salt salt password,只能使用MD5,Apache特有的MD5加密方式也是支持的。

默认的有效期是99999,即永久有效。最小修改密码天数是最后一次修改密码天数开始不能修改密码天数,三个密码事件时间顺序是警告天数,过期天数,过期后宽限天数

组配置文件中,依次是组名,密码占位符(用于指定组管理员),组id,附加用户

组密码文件中,依次是组名,密码,组管理员,附加用户

useradd创建一个用户,c用于注释,d指定家目录,e过期日期(Y-m-d),f宽限天数,也叫非活动天数,g指定用户组,G附加组,可用逗号分割,M不创建家目录,n不自动生成同名用户组,r系统用户,同时使用m创建家目录,否则不创建家目录,s指定shell,u用户id

D修改预设值/etc/default/useradd

usermod,c,d,e,f,g,G,m,r,s,u选项与useradd相同,a追加到用户组,l修改用户名,L锁定用户,密码前有叹号,无法登陆,U解除锁定

userdel,删除用户,f强制删除,r删除家目录和mail目录

groupadd,创建用户组,g指定gid,f强制创建,即使已经有组账号

groupdel,删除用户组

passwd,修改密码文件,k更新有效期,l锁定用户,u解除锁定,--stdin从标准输入读取密码,d删除密码,e使密码过期,n最短天数,即最小修改天数,x最长天数,即有效期,w警告天数,i宽限天数,S显示注释

chage,修改用户密码有效期,d更改最后一次修改密码时间(1970-01-01至今的天数),E过期日期(Y-m-d),I宽限天数,l显示有效期,m最短可更改密码天数,M最大有效天数,W警告天数

chpasswd,批量修改密码,较少使用,e使用加密的密码

chgrp,修改文件属组

su,切换用户,c执行命令,-更新环境变量

visudo,修改sudo文件,c检查语法,格式:用户名,机器=(角色),命令。命令前加NOPASSWD:无需输入密码

sudo,以另一个用户身份执行,l列出可用命令,h帮助,H指定家目录,V版本,v第一次和5分钟后需要输入密码,u指定用户,k清除缓存密码,K同k,同时删除时间戳文件,b后台执行,p更改询问密码提示语,e修改文件。

很多守护程序,shell被设置为/sbin/nologin,该用户无法执行命令。

一种是:sudo -u mysql touch /tmp/mysql.txt

一种是指定shell:su mysql -s /bin/bash -c 'touch /tmp/mysql2.txt'

id,显示用户信息,g用户组,G附加组,n显示用户名而不是数字,r显示实际id,rn需配合ugG使用,u用户ID

last显示用户最近登陆信息,lastb最近登陆失败记录,lastlog最近登陆记录

权限

分为读写执行权限,对应的字符是rwx,对应的数字是4,2,1,加起来就是7,还区分属主属组和其他用户权限,目录默认权限是755,属主可进入可以添加文件,其他用户只能查看不能添加文件。默认的文件权限是644,属主可以修改查看,其他用户只能查看,这意味着Linux中没有秘密,但家目录里,其他用户是没有任何权限的。

权限需要特别注意的,删除文件的权限是父目录的写权限,因为文件名在父目录的数据区中;没有执行权限并不意味着文件没法用,可以使用source,sh,php,python等命令加载文件,这时是不需要文件有执行权限的。source只要有一般文本文件后缀就可以加载执行。对于目录没有执行权限,只能查看文件名,无法cd进入目录,但root除外。

umask,默认值是0022,对文件而言,默认权限是使用666-umask,如果有执行权限则加1,对目录而言,默认权限是777-umask。使用时可以在小括号中,防止修改全局umask,(umask 0002;touch umaskfile),umaskfile权限为664。

chown,修改属主,R递归

chmod,修改权限,可使用的简称augo,符号+-=,权限7421或rwx,tTsSX

setfacl,设定ACL权限,ext系列文件系统要开启才行,xfs,btrfs默认开启,d设置新建文件和目录的默认权限,等同于-m d:u:root:rwx,h查看帮助,例如`-m u:root:rwx file`,b删除所有ACL权限,k删除所有默认ACL权限,R递归。

getfacl,查看ACL权限

特殊权限

SUID,执行程序时,使用属主身份和权限而不是实际用户的身份执行,典型就是passwd程序,属主有s权限,没有执行权限时是大写的S,数字表示是4xxx,对目录没有意义。

SGID,目录属组的用户有创建文件权限,创建的文件属组为目录的属组,数字表示是2xxx,对文件而言类似SUID,典型应用是locate命令,任何人都可以执行,执行期间拥有slocate组的权限。yum provides locate,yum install mlocate,updatedb(仅测试时执行,非常耗资源)

-rwx--s--x 1 root slocate 40520 Apr 11 2018 /usr/bin/locate

-rw-r----- 1 root slocate 2777252 Apr 16 23:25 /var/lib/mlocate/mlocate.db

属组可以读取该数据库文件

SBIT,粘滞位,对于多人可写目录,只能删除自己创建的文件。典型应用是/tmp目录。数字表示是1xxx,字符表示是t。

chattr,设定扩展权限,R递归

lsattr列出特殊权限,a只能以追加形式打开文件,A不修改atime,c自动压缩,C不使用写时复制(btrfs),d不允许dump,D同步写入到磁盘,e开启了数据块的范围映射,E压缩文件有错误,i锁定文件。。。

常用的扩展权限是i锁定关键文件,a使日志文件不允许清空

摘自某挖矿程序末尾

echo 0>/var/spool/mail/root

echo 0>/var/log/wtmp

echo 0>/var/log/secure

echo 0>/var/log/cron

下一篇:Linux系列05:网络和进程管理(完)