权限管理/用户管理
2021-03-30 10:41:53 1 举报
AI智能生成
linux 权限管理和用户管理学习资料整理
作者其他创作
大纲/内容
Linux基础知识-Part_6
权限管理
一、ACL权限
1、ACL概述:ACL是用于解决用户对文件身份不足的问题的
2、开启ACL
[root@localhost ~]# dumpe2fs -h /dev/sda3#dumpe2fs 命令是查询指定分区详细文件系统信息的命令选项:-h 仅显示超级块中信息,而不显示磁盘块组的详细信息。...省略部分输出...Default mount options: user_xattr acl ...省略部分输出...
如果没有开启,手工开启分区的 ACL 权限:
也可以通过修改/etc/fstab 文件,永久开启 ACL 权限:
3、ACL基本命令
getfacl 文件名 查询文件的 ACL 权限
setfacl 选项 文件名 设定 ACL 权限-m 设定 ACL 权限-b 删除 ACL 权限-x 用户 删除单个用户的 ACL 权限-R 递归,只能赋予目录
setfacl -m u:用户名:权限 文件名setfacl -m g:组名:权限 文件名
setfacl -m u:aa:rwx /test 给 test 目录赋予 aa 是读写执行的 ACL 权限
setfacl -m u:cc:rx -R soft/ 赋予递归 ACL 权限,只能赋予已经存在的目录-R 递归
setfacl -m d:u:aa:rwx -R /test ACL 默认权限。 注意:默认权限只能赋予之后创建的目录
注意:如果给目录赋予 acl 权限,两条命令都要输入
setfacl -m u:cc:rx -R soft/ 只对已经存在的文件生效setfacl -m d:u:aa:rwx -R /test 只对以后新建的文件生效
4、 最大有效权限mask
[root@localhost /]# setfacl -m m:rx project/#设定 mask 权限为 r-x。使用“m:权限”格式[root@localhost /]# getfacl project/# file: project/# owner: root# group: tgroupuser::rwxgroup::rwx #effective:r-xmask::r-x#mask 权限变为了 r-xother::---
实际的权限按照逻辑与进行运算
5、删除ACL权限
[root@localhost /]# setfacl -x u:st /project/#删除指定用户和用户组的 ACL 权限[root@localhost /]# setfacl -b project/#会删除文件的所有的 ACL 权限
ACL的问题
acl的缺点有权限溢出的安全问题,因为acl权限会使目录和文件都拥有相同的权限,而文件的最大权限是X,这就造成了权限溢出
二、sudo授权
给普通用户赋予部分管理员权限
/sbin/与/usr/sbin/在此目录下命令只有超级用户才能使用
1、 root身份:
visudo 赋予普通用户权限命令,命令执行后和 vi 一样使用
root ALL=(ALL) ALL#用户名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)# %wheel ALL=(ALL) ALL#%组名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)
用户名/组名:代表 root 给哪个用户或用户组赋予命令,注意组名前加“%”
用户可以用指定的命令管理指定 IP 地址的服务器。
如果写 ALL,代表可以管理任何主机,如果写固定 IP,代表用户可以管理指定的服务器。(这里真的很奇怪啊,超哥一直认为这里的IP 地址管理的是登录者来源的 IP 地址,查了很多资料也都是这样的。直到有一天超哥查看“man 5 sudoers”帮助,才发现大家原来都理解错误了,这里的 IP 指定的是用户可以管理哪个 IP 地址的服务器。那么如果你是一台独立的服务器,这里写 ALL 和你服务器的 IP 地址,作用是一样的。而写入网段,只有对 NIS 服务这样用户和密码集中管理的服务器才有意义)。
如果我们这里写本机的 IP 地址,不代表只允许本机的用户使用指定命令,而代表指定的用户可以从任何 IP 地址来管理当前服务器。
可使用身份:就是把来源用户切换成什么身份使用,(ALL)代表可以切换成任意身份。这个字段可以省略
授权命令:代表 root 把什么命令授权给普通用户。默认是 ALL,代表任何命令,这个当然不行。如果需要给那个命令授权,写入命令名即可,不过需要注意一定要命令写成绝对路径
2、举例
1)
举个例子,比如授权用户 user1 可以重启服务器,则由 root 用户添加如下行:
[root@localhost ~]# visudouser1 ALL= /sbin/shutdown –r now[user1@localhost ~]$ sudo -l#查看可用的授权
sudo 赋予的权限越详细,普通用户得到的权限越小
sudo 赋予的权限越简单,普通用户得到的权限越大
这样就可以再任意条件下使用vim工具,很危险
2)
再举个例子,授权一个用户管理你的 Web 服务器,不用自己插手是不是很爽,以后修改设置更新网页什么都不用管,一定 Happy 死了,Look:
首先要分析授权用户管理 Apache 至少要实现哪些基本授权:
1、可以使用 Apache 管理脚本2、可以修改 Apache 配置文件3、可以更新网页内容
假设 Aapche 管理脚本程序为/etc/rc.d/init.d/httpd 。
为满足条件一,用 visudo 进行授权:
授权用户 user1 可以连接 192.168.0.156 上的 Apache 服务器,通过 Apache 管理脚本重新读取配置文件让更改的设置生效(reload)和可以检测 Apache 配置文件语法错误(configtest),但不允许其执行关闭(stop)、重启(restart)等操作。(“\\”的意思是一行没有完成,下面的内容和上一行是同一行。)
为满足条件二,同样使用 visudo 授权:
[root@localhost ~]# visudouser1 192.168.0.156=/bin/vi /etc/httpd/conf/httpd.conf
授权用户 user1 可以用 root 身份使用 vi 编辑 Apache 配置文件。
以上两种 sudo 的设置,要特别注意,很多朋友使用 sudo 会犯两个错误:第一,授权命令没有细化到选项和参数;第二,认为只能授权管理员执行的命令。
条件三则比较简单,假设网页存放目录为/var/www/html ,则只需要授权 user1 对此目录具有写权限或者索性更改目录所有者为 user1 即可。如果需要,还可以设置 user1 可以通过 FTP 等文件共享服务更新网页。
3)
授权 aa 用户可以添加其他普通用户
aa ALL=/usr/sbin/useradd 赋予 aa 添加用户权限.命令必须写入绝对路径
aa ALL=/usr/bin/passwd 赋予改密码权限,取消对 root 的密码修改
如果仅仅赋予passwd的命令,就会出现将root密码修改的安全问题
注意逗号之后有空格
passwd 命令后不能出现空字符
原因是赋予的身份为(ALL)或不写,默认就是root用户
也不能出现 root字符
三、文件特殊权限SetUID、SetGID、Sticky BIT
1、SetUID
1)SetUID是什么
SetUID 的功能可以这样理解:
只有可以执行的二进制程序才能设定SUID 权限
如果不是执行文件,当赋予s权限时会报错,会变成大写的S
s(小)=S+x
仅有S时,没有执行权限
命令执行者要对该程序拥有x(执行)权限
说明如果没有执行权限,加了S也没用
命令执行者在执行该程序时获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件的属主)
SUID的作用
SetUID 权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效
2)举例
[root@localhost ~]# ll /etc/passwd-rw-r--r-- 1 root root 1728 1 月 19 04:20 /etc/passwd[root@localhost ~]# ll /etc/shadow---------- 1 root root 1373 1 月 19 04:21 /etc/shadow
因为
[root@localhost ~]# ll /usr/bin/passwd-rwsr-xr-x 1 root root 25980 2 月 22 2012 /usr/bin/passwd
/usr/bin/passwd 命令拥有特殊权限SetUID ,也就是在属主的权限位的执行权限上是s。
可以这样来理解它:当一个具有执行权限的文件设置SetUID 权限后,用户执行这个文件时将以文件所有者的身份执行
/usr/bin/passwd命令具有SetUID权限,所有者为roo(t Linux中的命令默认所有者都是root),也就是说当普通用户使用passwd 更改自己密码的时候,那一瞬间突然灵魂附体了,实际是在用passwd命令所有者root 的身份在执行passwd 命令,root 当然可以将密码写入/etc/shadow 文件(不要忘记root这个家伙是superman 什么事都可以干),所以普通用户也可以修改/etc/shadow 文件,命令执行完成后该身份也随之消失
如果取消SetUID 权限,则普通用户就不能修改自己的密码了
3)危险的 SetUID
[root@localhost ~]# chmod u+s /usr/bin/vim[root@localhost ~]# ll /usr/bin/vim-rwsr-xr-x 1 root root 1847752 4 月 5 2012 /usr/bin/vim
这样普通用户在执行vim,就会默认为root用户,可以修改任意的文件,有安全隐患。
4)有几点建议:
关键目录应严格控制写权限。比如“/”、“/usr”等;
用户的密码设置要严格遵守密码三原则;
对系统中默认应该具有SetUID 权限的文件作一列表,定时检查有没有这之外的文件被设置了SetUID 权限。
5)检测SetUID的脚本
[root@localhost ~]# vi suidcheck.sh#!/bin/bash# Author: shenchao (E-mail: shenchao@atguigu.com)find / -perm -4000 -o -perm -2000 > /tmp/setuid.check#搜索系统中所有拥有SUID 和SGID 的文件,并保存到临时目录中。for i in $(cat /tmp/setuid.check)#做循环,每次循环取出临时文件中的文件名dogrep $i /root/suid.list > /dev/null#比对这个文件名是否在模板文件中if [ \"$?\" != \"0\" ]#如果在,不报错thenecho \"$i isn't in listfile! \" >> /root/suid_log_$(date +%F)#如果文件名不再模板文件中,则报错。并把报错报错到日志中fidonerm -rf /tmp/setuid.check#删除临时文件[root@localhost ~]# chmod u+s /bin/vi#手工给vi 加入SUID 权限[root@localhost ~]# ./suidcheck.sh#执行检测脚本[root@localhost ~]# cat suid_log_2013-01-20/bin/vi isn't in listfile!#报错了,vi 不再模板文件中。代表vi 被修改了SUID 权限
2、SetGID
1)针对文件的作用
SGID 即可以针对文件生效,也可以针对目录生效,这和SUID 明显不同。如果针对文件,SGID 的含义如下:
只有可执行的二进制程序才能设置SGID 权限
命令执行在执行程序的时候,组身份升级为该程序文件的属组
SetGID 权限同样只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效
[root@localhost ~]# ll /var/lib/mlocate/mlocate.db-rw-r----- 1 root slocate 1838850 1 月 20 04:29 /var/lib/mlocate/mlocate.db
大家发现属主权限是r、w,属组权限是r,但是其他人权限是0:
[root@localhost ~]# ll /usr/bin/locate-rwx--s--x 1 root slocate 35612 8 月 24 2010 /usr/bin/locate
当普通用户user1 执行locate 命令时,会发生如下事情:
/usr/bin/locate 是可执行二进制程序,可以赋予SGID
执行用户user1 对/usr/bin/locate 命令拥有执行权限
执 行 /usr/bin/locate 命令时, 组身份会升级为slocate 组, 而slocate 组对/var/lib/mlocate/mlocate.db 数据库拥有r 权限,所以普通用户可以使用locate 命令查询mlocate.db 数据库
命令结束,user1 用户的组身份返回为user1 组
2)针对目录的作用
如果SGID 针对目录设置,含义如下:
普通用户必须对此目录拥有r 和x 权限,才能进入此目录
普通用户在此目录中的有效组会变成此目录的属组
若普通用户对此目录拥有w 权限时,新建的文件的默认属组是这个目录的属组
举个例子:
[root@localhost ~]# cd /tmp/#进入临时目录做此实验。因为临时目录才允许普通用户修改[root@localhost tmp]# mkdir dtest#建立测试目录[root@localhost tmp]# chmod g+s dtest#给测试目录赋予SGID[root@localhost tmp]# ll -d dtest/drwxr-sr-x 2 root root 4096 1 月 20 06:04 dtest/#SGID 已经生效[root@localhost tmp]# chmod 777 dtest/#给测试目录权限,让普通用户可以写[root@localhost tmp]# su – user1#切换成普通用户user1[user1@localhost ~]$ cd /tmp/dtest/#普通用户进入测试目录[user1@localhost dtest]$ touch abc#普通用户建立abc 文件[user1@localhost dtest]$ ll总用量 0-rw-rw-r-- 1 user1 root 0 1 月 20 06:07 abc#abc 文件的默认属组不再是user1 用户组,而变成了dtest 组的属组root
3、文件特殊权限之Sticky BIT
同要求普通用户对这个目录有7的权限才有效
Sticky BIT 粘着位,也简称为SBIT。SBIT 目前仅针对目录有效,它的作用如下:
粘着位目前只对目录有效
如果没有粘着位,因为普通用户拥有w 权限,所以可以删除此目录下所有文件,包括其他用户建立的文件。一但赋予了粘着位,除了root 可以删除所有文件,普通用户就算拥有w 权限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件。
4、设定文件特殊权限
特殊权限这样来表示:
4 代表SUID
2 代表SGID
1 代表SBIT
[root@localhost ~]# chmod 4755 ftest#赋予SUID 权限[root@localhost ~]# chmod 2755 ftest#赋予SGID 权限[root@localhost ~]# mkdir dtest[root@localhost ~]# chmod 1755 dtest/#SBIT 只对目录有效,所以建立测试目录,并赋予SBIT
四、文件系统属性chattr权限
1、命令格式
[root@localhost ~]# chattr [+-=] [选项] 文件或目录名选项:+: 增加权限-: 删除权限=: 等于某权限i: 如果对文件设置i 属性,那么不允许对文件进行删除、改名,也不能添加和修改数据;如果对目录设置i 属性,那么只能修改目录下文件的数据,但不允许建立和删除文件。a: 如果对文件设置a 属性,那么只能在文件中增加数据,但是不能删除也不能修改数据;如果对目录设置a 属性,那么只允许在目录中建立和修改文件,但是不允许删 除e: Linux 中绝大多数的文件都默认拥有e 属性。表示该文件是使用ext 文件系统进行存储的,而且不能使用“chattr -e”命令取消e 属性。
2、查看文件系统属性lsattr
[root@localhost ~]# lsattr 选项 文件名选项:-a 显示所有文件和目录-d 若目标是目录,仅列出目录本身的属性,而不是子文件的
3、举例
例1:#给文件赋予i 属性[root@localhost ~]# touch ftest#建立测试文件[root@localhost ~]# chattr +i ftest[root@localhost ~]# rm -rf ftestrm: 无法删除\"ftest\": 不允许的操作#赋予i 属性后,root 也不能删除[root@localhost ~]# echo 111 >> ftest-bash: ftest: 权限不够#也不能修改文件的数据#给目录赋予i 属性[root@localhost ~]# mkdir dtest#建立测试目录[root@localhost dtest]# touch dtest/abc#再建立一个测试文件abc[root@localhost ~]# chattr +i dtest/#给目录赋予i 属性[root@localhost ~]# cd dtest/[root@localhost dtest]# touch bcdtouch: 无法创建\"bcd\": 权限不够#dtest 目录不能新建文件[root@localhost dtest]# echo 11 >> abc[root@localhost dtest]# cat abc11#但是可以修改文件内容[root@localhost dtest]# rm -rf abcrm: 无法删除\"abc\": 权限不够#不能删除
例2:
[root@localhost ~]# mkdir -p /back/log#建立备份目录[root@localhost ~]# chattr +a /back/log/#赋予a 属性[root@localhost ~]# cp /var/log/messages /back/log/#可以复制文件和新建文件到指定目录[root@localhost ~]# rm -rf /back/log/messagesrm: 无法删除\"/back/log/messages\": 不允许的操作#但是不允许删除
用户管理
一、用户相关文件
1 /etc/passwd 用户信息文件
root:x:0:0:root:/root:/bin/bashdaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologinbin:x:2:2:bin:/bin:/usr/sbin/nologinsys:x:3:3:sys:/dev:/usr/sbin/nologinsync:x:4:65534:sync:/bin:/bin/sync
第一列: 用户名
第二列: 密码位
\"x\"为密码标记位,意味着该用户有密码,并且会在/etc/shadow文件中寻找
第三列: 用户 ID
0 超级用户 UID。如果用户 UID 为 0,代表这个账号是管理员账号。那 Linux 中如何把普通用户升级成为管理员呢?就是把其他用户的 UID 修改为 0 就可以了,这点和Windows 是不同的。不过不建议建立多个管理员账号。
如何把普通用户变成超级用户:把用户 UID 改为 0
1-499 系统用户(伪用户)UID。这些 UID 账号是系统保留给系统用户的 UID,也就是说 UID 是 1-499 范围内的用户是不能登录系统的,而是用来运行系统或服务的。其中1-99 是系统保留的账号,系统自动创建。100-499是预留给用户创建系统账号的。
500-60000 普通用户 UID。建立的普通用户 UID 从 500 开始,最大到 60000。这些用户足够使用了,但是如果不够也不用害怕,2.6.x 内核以后的 Linux 系统用户 UID 已经可以支持 2的32次方这么多了。
用户的权限是绑定在用户UID之上,与组无关
第四列:组 ID
组 ID GID 添加用户时,如果不指定用户所属的初始组,那么会建立和用户名相同的组
第五列: 用户说明
相当于描述,可有可无
第六列: 用户家目录 ~
第七列: 登录 shell /bin/bash
2 /etc/shadow 影子文件
root:$6$9w5Td6lg$bgpsy3olsq9WwWvS5Sst2W3ZiJpuCGDY.4w4MRk3ob/i85fI38RH15wzVoomff9isV1PzdcXmixzhnMVhMxbv0:15775:0:99999:7:::
第二列: 加密密码
我们也可以在密码前人为的加入“!”或“*”改变加密值让密码暂时失效,使这个用户无法登陆,达到暂时禁止用户登录的效果。
注意所有伪用户的密码都是“!!”或“*”,代表没有密码是不能登录的。当然我新创建的用户如果不设定密码,它的密码项也是“!!”,代表这个用户没有密码,不能登录
R6版本加密方式改为了SHA512
加密等级比较高
R5版本之前的机密方式为MD5
加密等级比较低
时间戳转日期
[root@localhost ~]# date -d \"1970-01-01 15775 days\"2013 年 03 月 11 日 星期一 00:00:00 CST
日期转时间戳
[root@localhost ~]# echo $(($(date --date=\"2013/03/11\" +%s)/86400+1))15775
第四列: 两次密码的修改间隔时间(和第 3 字段相比)
第五例: 密码有效期(和第 3 字段相比)
如果值为-1,意味着永远有效
第六列: 密码修改到期前的警告天数(和第 5 字段相比)
第七列: 密码过期后的宽限天数(和第 5 字段相比)
第八列: 密码失效时间
这里同样要写时间戳,也就是用 1970 年 1 月 1 日进行时间换算。如果超过了失效时间,就算密码没有过期,用户也就失效无法使用
第九列: 保留
3 /etc/group 组信息文件
第一列: 组名
第二列: 组密码位
一般不建议设置密码,设置密码一般用来给予组管理员使用,用来管理组成员
第三列: GID
第四列: 此组中支持的其他用户.附加组是此组的用户
初始组:每个用户初始组只能有一个,初始组只能有一个,一般都是和用户名相同的组作为初始组
附加组:每个用户可以属于多个附加组。要把用户加入组,都是加入附加组
4 组密码文件/etc/gshadow
如果我给用户组设定了组管理员,并给该用户组设定了组密码,组密码就保存在这个文件当中。组管理员就可以利用这个密码管理这个用户组了。
5 用户的家目录
6 用户邮箱目录
这个邮箱在/var/spool/mail 目录当中,例如 user1 用户的邮箱就是/var/spool/mail/user1 文件
7 用户模板目录
/etc/skel/
用来保证新建用户的家目录下有通用的环境,文件,信息文件
二 、用户管理命令
1 添加用户
1.1 手工删除用户
手工删除用户试验:手工删除,如果可以正常建立用户,证明用户删除干净。
/etc/passwd/etc/shadow/etc/group/etc/gshadow/home/user1/var/spool/mail/user1 邮箱
想要删除干净,这六个文件中用户信息都要删除
用户一定要添加密码,否则不允许登录
但是安装的服务不必设置密码
1.2 useradd 命令
useradd 选项 用户名
选项:-u 550 指定 UID-g 组名 指定初始组 不要手工指定-G 组名 指定附加组,把用户加入组,使用附加组-c 说明 添加说明-d 目录 手工指定家目录,目录不需要事先建立-s shell /bin/bash.
不建议使用选项,使用默认的就好
-c 添加说明时,如果有空格使用“”括起来
-d 指定家目录不需要另外创建文件目录,这个命令会自动创建目录
例子
例如:[root@localhost ~]# groupadd lamp1#先手工添加 lamp1 用户组,因为我一会要把 lamp1 用户的初始组指定过来,如果不事先建立,会报错用户组不存在[root@localhost ~]# useradd -u 550 -g lamp1 -G root -d /home/lamp1 \\-c \"test user\" -s /bin/bash lamp1#建立用户 lamp1 的同时指定了 UID(550),初始组(lamp1),附加组(root),家目录(/home/lamp1),用户说明(test user)和用户登录 shell(/bin/bash)[root@localhost ~]# grep \"lamp1\" /etc/passwd /etc/shadow /etc/group#同时查看三个文件/etc/passwd:lamp1:x:550:502:test user:/home/lamp1:/bin/bash#用户的 UID、初始组、用户说明、家目录和登录 shell 都和命令手工指定的一致/etc/shadow:lamp1:!!:15710:0:99999:7:::#lamp1 用户还没有设定密码/etc/group:root:x:0:lamp1#lamp1 用户加入了 root 组,root 组是 lamp1 用户的附加组/etc/group:lamp1:x:502:#GID502 的组是 lamp1 组[root@localhost ~]# ll -d /home/lamp1/drwx------ 3 lamp1 lamp1 4096 1 月 6 01:13 /home/lamp1/#家目录也建立了啊。不需要手工建立家目录
1.3 useradd 默认值
useradd 添加用户时参考的默认值文件主要有两个 , 分别是 /etc/default/useradd 和/etc/login.defs
1)/etc/default/useradd
[root@localhost ~]# vi /etc/default/useradd# useradd defaults fileGROUP=100HOME=/homeINACTIVE=-1EXPIRE=SHELL=/bin/bashSKEL=/etc/skelCREATE_MAIL_SPOOL=yes
GROUP=100
这个选项是建立用户的默认组,也就是说添加每个用户时,用户的初始组就是 GID 为 100 的这个用户组。目前我们采用的机制私有用户组机制。
HOME=/home
这个选项是用户的家目录的默认位置,所以所有的新建用户的家目录默认都在/home/下。
INACTIVE=-1
这个选项就是密码过期后的宽限天数,也就是/etc/shadow 文件的第七个字段。如果是天数,比如 10 代表密码过期后 10 天后失效;如果是 0,代表密码过期后立即失效;如果是-1,则代表密码永远不会失效。这里默认值是-1,所以所有新建立的用户密码都不会失效。
EXPIRE=
这个选项是密码失效时间,也就是/etc/shadow 文件的第八个字段。也就说用户到达这个日期后就会直接失效。当然这里也是使用时间戳来表示日期的。默认值是空,所以所有新建用户没有失效时间,永久有效。
SHELL=/bin/bash
这个选项是用户的默认 shell 的。/bin/bash 是 Linux 的标志 shell,所以所有新建立的用户默认都具备 shell 赋予的权限。
SKEL=/etc/skel
这个选项就是定义用户的模板目录的位置,/etc/skel/目录中的文件都会复制到新建用户的家目录当中。
CREATE_MAIL_SPOOL=yes
这个选项定义是否给新建用户建立邮箱,默认是创建,也就是说所有的新建用户系统都会新建一个邮箱,放在/var/spool/mail/下和用户名相同。
2)/etc/login.defs
[root@localhost ~]# vi /etc/login.defs#这个文件有些注释,把注释删除掉,文件内容就变成下面这个样子了MAIL_DIR /var/spool/mailPASS_MAX_DAYS 99999PASS_MIN_DAYS 0PASS_MIN_LEN 5PASS_WARN_AGE 7UID_MIN 500UID_MAX 60000GID_MIN 500GID_MAX 60000CREATE_HOME yesUMASK 077USERGROUPS_ENAB yesENCRYPT_METHOD SHA512
MAIL_DIR /var/spool/mail
这行指定了新建用户的默认邮箱位置。比如 user1 用户的邮箱是就是/var/spool/mail/user1
PASS_MAX_DAYS 99999
这行指定的是密码的有效期,也就是/etc/shadow 文件的第五字段。代表多少天之后必须修改密码,默认值是 99999。
PASS_MIN_DAYS 0
这行指定的是两次密码的修改间隔时间,也就是/etc/shadow 文件的第四字段。代表第一次修改密码之后,几天后才能再次修改密码。默认值是 0。
PASS_MIN_LEN 5
这行代表密码的最小长度,默认不小于 5 位。但是我们现在用户登录时验证已经被 PAM 模块取代,所以这个选项并不生效。
PASS_WARN_AGE 7
这行代表密码修改到期前的警告天数,也就是/etc/shadow 文件的第六字段。代表密码到底有效期前多少天开始进行警告提醒,默认值是 7 天。
UID_MIN 500
UID_MAX 60000
GID_MIN 500
GID_MAX 60000
CREATE_HOME yes
这行指定建立用户时是否自动建立用户的家目录,默认是建立
UMASK 077
这行指定的是建立的用户家目录的默认权限,因为 umask 值是 077,所以新建的用户家目录的权限是 700,umask 的具体作用和修改方法我们可以参考下一章权限设定章节。
USERGROUPS_ENAB yes
这行指定的是使用命令 userdel 删除用户时,是否删除用户的初始组,默认是删除。
ENCRYPT_METHOD SHA512
这行指定 Linux 用户的密码使用 SHA512 散列模式加密,这是新的密码加密模式,原先的 Linux只能用 DES 或 MD5 方式加密
这两行代表创建用户时,最小 UID 和最大的 UID 的范围。我们 2.6.x 内核开始,Linux 用户的 UID最大可以支持 2的32次方这么多,但是真正使用时最大范围是 60000。还要注意如果我手工指定了一个用户的UID 是 550,那么下一个创建的用户的 UID 就会从 551 开始,哪怕 500-549 之间的 UID 没有使用(小于 500 的 UID 是给伪用户预留的)。
这两行指定了 GID 的最小值和最大值之间的范围。
2 设定密码
[root@localhost ~]#passwd [选项] 用户名选项:-l: 暂时锁定用户。仅 root 用户可用-u: 解锁用户。仅 root 用户可用--stdin: 可以将通过管道符输出的数据作为用户的密码。主要在批量添加用户时使用
[root@localhost ~]#passwd#passwd 直接回车代表修改当前用户的密码
root用户可以修改其他用户的密码,而普通用户不能修改其他用户的密码
普通用户修改自身的密码,只需要passwd 命令就行
也可以使用字符串作为密码:
[root@localhost ~]# echo \"123\" | passwd --stdin user1 更改用户 user1 的密码 。
此命令可以避免修改用户时,有交互,可以批量修改密码
可以通过命令,把密码修改日期归零(shadow 第 3 字段).这样用户一登陆就要修改密码,例如:
[root@localhost ~]# chage -d 0 user1
3 用户信息修改
usermod 命令是修改已经添加的用户的信息的,命令如下:
[root@localhost ~]#usermod [选项] 用户名选项:-u UID: 修改用户的 UID-d 家目录: 修改用户的家目录。家目录必须写绝对路径-c 用户说明: 修改用户的说明信息,就是/etc/passwd 文件的第五个字段-g 组名: 修改用户的初始组,就是/etc/passwd 文件的第四个字段-G 组名: 修改用户的附加组,其实就是把用户加入其他用户组-s shell: 修改用户的登录 Shell。默认是/bin/bash-e 日期: 修改用户的失效日期,格式为“YYYY-MM-DD”。也就是/etc/shadow文件的第八个字段-L: 临时锁定用户(Lock)-U: 解锁用户(Unlock)
有学员突发奇想,问超哥,那用户可以修改用户名吗?当然可以:
[root@localhost ~]# usermod -l 新名 旧名#改名
但是真不建议改名,这样及其容易把管理员自己搞晕菜,建议删除旧用户,再建立新用户!
4 删除用户
[root@localhost ~]# userdel [-r] 用户名选项:-r: 在删除用户的同时删除用户的家目录
5 切换用户身份
su 命令可以切换成不同的用户身份,命令格式如下:
[root@localhost ~]# su [选项] 用户名选项:-: 选项只使用“-”代表连带用户的环境变量一起切换-c 命令:切换身份后,仅执行一次命令,然后在返回当前身份-s 类似于-c 是执行脚本文件
“-”不能省略,它代表切换用户身份时,用户的环境变量也要切换成新用户的环境变量。
REDHAT5 之前的版本,如果不加 “-”就无法使用root用户下的命令,REDHAD6之后可以使用
exit可以退出所切换的目录
超级用户切换普通用户,不需要输入密码
相反则需要密码
三 、组管理命令
1 添加用户组:groupadd
添加用户组的命令是 groupadd,命令格式如下:
[root@localhost ~]# groupadd [选项] 组名选项:-g GID: 指定组 ID
添加用户组的命令比较简单,举个例子:
[root@localhost ~]# groupadd group1#添加 group1 组[root@localhost ~]# grep \"group1\" /etc/groupgroup1:x:502:
2 删除用户组:groupdel
groupdel 命令用于删除用户组,命令格式如下:
[root@localhost ~]#groupdel 组名例子:
[root@localhost ~]#groupdel testgrp#删除 testgrp 组
不过大家要注意,要删除的组不能是其他用户的初始组,也就是说这个组中没有初始用户才可以删除。如果组中有附加用户,则删除组时不受影响。
4 把用户添加进组或从组中删除:gpasswd
其实 gpasswd 命令是用来设定组密码并指定组管理员的,不过我们在前面已经说了,组密码和组管理员功能很少使用,而且完全可以被 sudo 命令取代,所以 gpasswd 命令现在主要用于把用户添加进组或从组中删除。命令格式如下:
[root@localhost ~]# gpasswd [选项] 组名选项:-a 用户名: 把用户加入组-d 用户名: 把用户从组中删除
[root@localhost ~]# groupadd grouptest#添加组 grouptest[root@localhost ~]# gpasswd -a user1 grouptestAdding user user1 to group grouptest#把用户 user1 加入 grouptest 组[root@localhost ~]# grep \"user1\" /etc/groupuser1:x:501:grouptest:x:505:user1#查看一下,user1 用户已经作为附加用户加入 grouptest 组[root@localhost ~]# gpasswd -d user1 grouptest Removing user user1 from group grouptest#把用户 user1 从组中删除[root@localhost ~]# grep \"grouptest\" /etc/groupgrouptest:x:505:#组中没有 user1 用户了
大家注意,也可以使用 usermod 命令把用户加入某个组,不过 usermod 命令的操作对象是用户,命令是“usermod -G grouptest user1”,把用户名作为参数放在最后;而 gpasswd 命令的操作对象是组,命令是“gpasswd -a user1 grouptest”,把组名作为参数放在最后。
5 改变有效组:newgrp
每个用户可以属于一个初始组(用户是这个组的初始用户),也可以属于多个附加组(用户是这个组的附加用户)。既然用户可以属于这么多用户组,那么用户在创建文件后,默认生效的组身份是哪个呢?当然是初始用户组的组身份生效了,因为初始组是用户一旦登录就直接获得的组身份。也就是说,用户在创建文件后,文件的属组是用户的初始组,因为用户的有效组默认是初始组。
既然用户属于多个用户组,那么能不能改变用户的有效组呢?使用命令 newgrp 就可以切换用户的有效组。命令格式如下:
[root@localhost ~]# newgrp 组名
举个例子,我们已经有了普通用户 user1,默认会建立 user1 用户组,user1 组是 user1 用户的初始组。我们再把 user1 用户加入 group1 组,那么 group1 组就是 user1 用户的附加组。当 user1 用户创建文件 test1 时,test1 文件的属组是 user1 组,因为 user1 组是 user1 用户的有效组。通过 newgrp命令就可以把 user1 用户的有效组变成 group1 组,当 user1 用户创建文件 test2 时,就会发现 test2文件的属组就是 group1 组。命令如下:
[root@localhost ~]# groupadd group1#添加组 group1[root@localhost ~]# gpasswd -a user1 group1Adding user user1 to group group1#把 user1 用户加入 group1 组[root@localhost ~]# grep \"user1\" /etc/groupuser1:x:501:group1:x:503:user1#user1 用户既属于 user1 组,也属于 group1 组[root@localhost ~]# su – user1#切换成 user1 身份,超级用户切换成普通用户不用密码[user1@localhost ~]$ touch test1#创建文件 test1[user1@localhost ~]$ ll test1-rw-rw-r-- 1 user1 user1 0 1 月 14 05:43 test1#test1 文件的默认属组是 user1 组[user1@localhost ~]$ newgrp group1#切换 user1 用户的有效组为 group1 组[user1@localhost ~]$ touch test2#创建文件 test2[user1@localhost ~]$ ll test2-rw-r--r-- 1 user1 group1 0 1 月 14 05:44 test2#test2 文件的默认属组是 group1 组
通过这个例子明白有效组的作用了吗?其实就是当用户属于多个组时,在创建文件时哪个组身份生效。使用 newgrp 命令可以在多个组身份之间切换。
6. 组权限实验
0 条评论
回复 删除
下一页