权限管理/用户管理
2021-03-30 10:41:53 1 举报
AI智能生成
linux 权限管理和用户管理学习资料整理
作者其他创作
大纲/内容
权限管理
一、ACL权限
1、ACL概述:ACL是用于解决用户对文件身份不足的问题的
2、开启ACL
[root@localhost ~]# dumpe2fs -h /dev/sda3
#dumpe2fs 命令是查询指定分区详细文件系统信息的命令
选项:
-h 仅显示超级块中信息,而不显示磁盘块组的详细信息。
...省略部分输出...
Default mount options: user_xattr acl
...省略部分输出...
#dumpe2fs 命令是查询指定分区详细文件系统信息的命令
选项:
-h 仅显示超级块中信息,而不显示磁盘块组的详细信息。
...省略部分输出...
Default mount options: user_xattr acl
...省略部分输出...
如果没有开启,手工开启分区的 ACL 权限:
[root@localhost ~]# mount -o remount,acl /
#重新挂载根分区,并挂载加入 acl 权限
也可以通过修改/etc/fstab 文件,永久开启 ACL 权限:
[root@localhost ~]# vi /etc/fstab
UUID=c2ca6f57-b15c-43ea-bca0-f239083d8bd2 / ext4 defaults,acl 1 1
#加入 acl
[root@localhost ~]# mount -o remount /
#重新挂载文件系统或重启动系统,使修改生效
3、ACL基本命令
getfacl 文件名 查询文件的 ACL 权限
setfacl 选项 文件名 设定 ACL 权限
-m 设定 ACL 权限
-b 删除 ACL 权限
-x 用户 删除单个用户的 ACL 权限
-R 递归,只能赋予目录
-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 递归
-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 只对以后新建的文件生效
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: tgroup
user::rwx
group::rwx #effective:r-x
mask::r-x
#mask 权限变为了 r-x
other::---
#设定 mask 权限为 r-x。使用“m:权限”格式
[root@localhost /]# getfacl project/
# file: project/
# owner: root
# group: tgroup
user::rwx
group::rwx #effective:r-x
mask::r-x
#mask 权限变为了 r-x
other::---
实际的权限按照逻辑与进行运算
5、删除ACL权限
[root@localhost /]# setfacl -x u:st /project/
#删除指定用户和用户组的 ACL 权限
[root@localhost /]# setfacl -b project/
#会删除文件的所有的 ACL 权限
#删除指定用户和用户组的 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
#%组名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)
#用户名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)
# %wheel ALL=(ALL) ALL
#%组名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)
用户名/组名:代表 root 给哪个用户或用户组赋予命令,注意组名前加“%”
用户可以用指定的命令管理指定 IP 地址的服务器。
如果写 ALL,代表可以管理任何主机,如
果写固定 IP,代表用户可以管理指定的服务器。(这里真的很奇怪啊,超哥一直认为这里的
IP 地址管理的是登录者来源的 IP 地址,查了很多资料也都是这样的。直到有一天超哥查看
“man 5 sudoers”帮助,才发现大家原来都理解错误了,这里的 IP 指定的是用户可以管理
哪个 IP 地址的服务器。那么如果你是一台独立的服务器,这里写 ALL 和你服务器的 IP 地址,
作用是一样的。而写入网段,只有对 NIS 服务这样用户和密码集中管理的服务器才有意义)。
果写固定 IP,代表用户可以管理指定的服务器。(这里真的很奇怪啊,超哥一直认为这里的
IP 地址管理的是登录者来源的 IP 地址,查了很多资料也都是这样的。直到有一天超哥查看
“man 5 sudoers”帮助,才发现大家原来都理解错误了,这里的 IP 指定的是用户可以管理
哪个 IP 地址的服务器。那么如果你是一台独立的服务器,这里写 ALL 和你服务器的 IP 地址,
作用是一样的。而写入网段,只有对 NIS 服务这样用户和密码集中管理的服务器才有意义)。
如果我们这里写本机的 IP 地址,不代表只允许本机的用户使用指定命令,而代表指定的用
户可以从任何 IP 地址来管理当前服务器。
户可以从任何 IP 地址来管理当前服务器。
可使用身份:就是把来源用户切换成什么身份使用,(ALL)代表可以切换成任意身份。这
个字段可以省略
个字段可以省略
授权命令:代表 root 把什么命令授权给普通用户。默认是 ALL,代表任何命令,这个当然不
行。如果需要给那个命令授权,写入命令名即可,不过需要注意一定要命令写成绝对路径
行。如果需要给那个命令授权,写入命令名即可,不过需要注意一定要命令写成绝对路径
2、举例
1)
举个例子,比如授权用户 user1 可以重启服务器,则由 root 用户添加如下行:
[root@localhost ~]# visudo
user1 ALL= /sbin/shutdown –r now
[user1@localhost ~]$ sudo -l
#查看可用的授权
user1 ALL= /sbin/shutdown –r now
[user1@localhost ~]$ sudo -l
#查看可用的授权
sudo 赋予的权限越详细,普通用户得到的权限越小
sudo 赋予的权限越简单,普通用户得到的权限越大
2)
再举个例子,授权一个用户管理你的 Web 服务器,不用自己插手是不是很爽,以后修改设置更新
网页什么都不用管,一定 Happy 死了,Look:
网页什么都不用管,一定 Happy 死了,Look:
首先要分析授权用户管理 Apache 至少要实现哪些基本授权:
1、可以使用 Apache 管理脚本
2、可以修改 Apache 配置文件
3、可以更新网页内容
2、可以修改 Apache 配置文件
3、可以更新网页内容
假设 Aapche 管理脚本程序为/etc/rc.d/init.d/httpd 。
为满足条件一,用 visudo 进行授权:
[root@localhost ~]# visudo
user1 192.168.0.156=/etc/rc.d/init.d/httpd reload,\
/etc/rc.d/init.d/httpd configtest
user1 192.168.0.156=/etc/rc.d/init.d/httpd reload,\
/etc/rc.d/init.d/httpd configtest
授权用户 user1 可以连接 192.168.0.156 上的 Apache 服务器,通过 Apache 管理脚本重新读取配
置文件让更改的设置生效(reload)和可以检测 Apache 配置文件语法错误(configtest),但不允
许其执行关闭(stop)、重启(restart)等操作。(“\”的意思是一行没有完成,下面的内容和上
一行是同一行。)
置文件让更改的设置生效(reload)和可以检测 Apache 配置文件语法错误(configtest),但不允
许其执行关闭(stop)、重启(restart)等操作。(“\”的意思是一行没有完成,下面的内容和上
一行是同一行。)
为满足条件二,同样使用 visudo 授权:
[root@localhost ~]# visudo
user1 192.168.0.156=/bin/vi /etc/httpd/conf/httpd.conf
user1 192.168.0.156=/bin/vi /etc/httpd/conf/httpd.conf
授权用户 user1 可以用 root 身份使用 vi 编辑 Apache 配置文件。
以上两种 sudo 的设置,要特别注意,很多朋友使用 sudo 会犯两个错误:第一,授权命令没有细
化到选项和参数;第二,认为只能授权管理员执行的命令。
化到选项和参数;第二,认为只能授权管理员执行的命令。
条件三则比较简单,假设网页存放目录为/var/www/html ,则只需要授权 user1 对此目录具有写权限
或者索性更改目录所有者为 user1 即可。如果需要,还可以设置 user1 可以通过 FTP 等文件共享服务
更新网页。
或者索性更改目录所有者为 user1 即可。如果需要,还可以设置 user1 可以通过 FTP 等文件共享服务
更新网页。
3)
授权 aa 用户可以添加其他普通用户
aa ALL=/usr/sbin/useradd 赋予 aa 添加用户权限.命令必须写入绝对路径
aa ALL=/usr/bin/passwd 赋予改密码权限,取消对 root 的密码修改
如果仅仅赋予passwd的命令,就会出现将root密码修改的安全问题
需要修改为:aa ALL=/usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd "", !/usr/bin/passwd root
注意逗号之后有空格
passwd 命令后不能出现空字符
原因是赋予的身份为(ALL)或不写,默认就是root用户
也不能出现 root字符
三、文件特殊权限SetUID、SetGID、Sticky BIT
1、SetUID
1)SetUID是什么
SetUID 的功能可以这样理解:
只有可以执行的二进制程序才能设定SUID 权限
如果不是执行文件,当赋予s权限时会报错,会变成大写的S
s(小)=S+x
仅有S时,没有执行权限
命令执行者要对该程序拥有x(执行)权限
s(小)=S+x
仅有S时,没有执行权限
说明如果没有执行权限,加了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
-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)
#做循环,每次循环取出临时文件中的文件名
do
grep $i /root/suid.list > /dev/null
#比对这个文件名是否在模板文件中
if [ "$?" != "0" ]
#如果在,不报错
then
echo "$i isn't in listfile! " >> /root/suid_log_$(date +%F)
#如果文件名不再模板文件中,则报错。并把报错报错到日志中
fi
done
rm -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 权限
#!/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)
#做循环,每次循环取出临时文件中的文件名
do
grep $i /root/suid.list > /dev/null
#比对这个文件名是否在模板文件中
if [ "$?" != "0" ]
#如果在,不报错
then
echo "$i isn't in listfile! " >> /root/suid_log_$(date +%F)
#如果文件名不再模板文件中,则报错。并把报错报错到日志中
fi
done
rm -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 权限
命令执行者要对该程序拥有x(执行)权限
命令执行在执行程序的时候,组身份升级为该程序文件的属组
SetGID 权限同样只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效
[root@localhost ~]# ll /var/lib/mlocate/mlocate.db
-rw-r----- 1 root slocate 1838850 1 月 20 04:29 /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
#进入临时目录做此实验。因为临时目录才允许普通用户修改
[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 目前仅针对目录有效,它的作用如下:
粘着位目前只对目录有效
普通用户对该目录拥有r,w 和x 权限,即普通用户可以在此目录拥有写入权限
如果没有粘着位,因为普通用户拥有w 权限,所以可以删除此目录下所有文件,包括其他用
户建立的文件。一但赋予了粘着位,除了root 可以删除所有文件,普通用户就算拥有w 权
限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件。
户建立的文件。一但赋予了粘着位,除了root 可以删除所有文件,普通用户就算拥有w 权
限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件。
4、设定文件特殊权限
特殊权限这样来表示:
4 代表SUID
2 代表SGID
1 代表SBIT
四、文件系统属性chattr权限
1、命令格式
[root@localhost ~]# chattr [+-=] [选项] 文件或目录名
选项:
+: 增加权限
-: 删除权限
=: 等于某权限
i: 如果对文件设置i 属性,那么不允许对文件进行删除、改名,也不能添加和修改数
据;如果对目录设置i 属性,那么只能修改目录下文件的数据,但不允许建立和删
除文件。
a: 如果对文件设置a 属性,那么只能在文件中增加数据,但是不能删除也不能修改数
据;如果对目录设置a 属性,那么只允许在目录中建立和修改文件,但是不允许删 除
e: Linux 中绝大多数的文件都默认拥有e 属性。表示该文件是使用ext 文件系统进行
存储的,而且不能使用“chattr -e”命令取消e 属性。
选项:
+: 增加权限
-: 删除权限
=: 等于某权限
i: 如果对文件设置i 属性,那么不允许对文件进行删除、改名,也不能添加和修改数
据;如果对目录设置i 属性,那么只能修改目录下文件的数据,但不允许建立和删
除文件。
a: 如果对文件设置a 属性,那么只能在文件中增加数据,但是不能删除也不能修改数
据;如果对目录设置a 属性,那么只允许在目录中建立和修改文件,但是不允许删 除
e: Linux 中绝大多数的文件都默认拥有e 属性。表示该文件是使用ext 文件系统进行
存储的,而且不能使用“chattr -e”命令取消e 属性。
2、查看文件系统属性lsattr
[root@localhost ~]# lsattr 选项 文件名
选项:
-a 显示所有文件和目录
-d 若目标是目录,仅列出目录本身的属性,而不是子文件的
选项:
-a 显示所有文件和目录
-d 若目标是目录,仅列出目录本身的属性,而不是子文件的
3、举例
例1:
#给文件赋予i 属性
[root@localhost ~]# touch ftest
#建立测试文件
[root@localhost ~]# chattr +i ftest
[root@localhost ~]# rm -rf ftest
rm: 无法删除"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 bcd
touch: 无法创建"bcd": 权限不够
#dtest 目录不能新建文件
[root@localhost dtest]# echo 11 >> abc
[root@localhost dtest]# cat abc
11
#但是可以修改文件内容
[root@localhost dtest]# rm -rf abc
rm: 无法删除"abc": 权限不够
#不能删除
#给文件赋予i 属性
[root@localhost ~]# touch ftest
#建立测试文件
[root@localhost ~]# chattr +i ftest
[root@localhost ~]# rm -rf ftest
rm: 无法删除"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 bcd
touch: 无法创建"bcd": 权限不够
#dtest 目录不能新建文件
[root@localhost dtest]# echo 11 >> abc
[root@localhost dtest]# cat abc
11
#但是可以修改文件内容
[root@localhost dtest]# rm -rf abc
rm: 无法删除"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/messages
rm: 无法删除"/back/log/messages": 不允许的操作
#但是不允许删除
用户管理
一、用户相关文件
1 /etc/passwd 用户信息文件
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync: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
如何把普通用户变成超级用户:把用户 UID 改为 0
用户的权限是绑定在用户UID之上,与组无关
2 /etc/shadow 影子文件
root:$6$9w5Td6lg$bgpsy3olsq9WwWvS5Sst2W3ZiJpuCGDY.4w4MRk3ob/i85fI38RH15wzVoomff9isV1PzdcXmixzhnMVhMxbv0:15775:0:99999:7:::
第一列: 用户名
第二列: 加密密码
我们也可以在密码前人为的加入“!”或“*”改变加密值让密码暂时失效,使这个用户无法登陆,达到暂时禁止用户登录的效果。
注意所有伪用户的密码都是“!!”或“*”,代表没有密码是不能登录的。当然我新创建的用户如果不设定密码,它的密码项也是“!!”,代表这个用户没有密码,不能登录
R6版本加密方式改为了SHA512
加密等级比较高
R5版本之前的机密方式为MD5
加密等级比较低
第三列: 密码最近更改时间, 1970 年 1 月 1 日作为标准时间
时间戳转日期
[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 组信息文件
root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:syslog,wangxin
tty:x:5:syslog
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:syslog,wangxin
tty:x:5:syslog
第一列: 组名
第二列: 组密码位
一般不建议设置密码,设置密码一般用来给予组管理员使用,用来管理组成员
第三列: 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 邮箱
/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.
-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/
#家目录也建立了啊。不需要手工建立家目录
[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 file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
GROUP=100
这个选项是建立用户的默认组,也就是说添加每个用户时,用户的初始组就是 GID 为 100 的这个
用户组。目前我们采用的机制私有用户组机制。
用户组。目前我们采用的机制私有用户组机制。
HOME=/home
这个选项是用户的家目录的默认位置,所以所有的新建用户的家目录默认都在/home/下。
INACTIVE=-1
这个选项就是密码过期后的宽限天数,也就是/etc/shadow 文件的第七个字段。如果是天数,比
如 10 代表密码过期后 10 天后失效;如果是 0,代表密码过期后立即失效;如果是-1,则代表密码永
远不会失效。这里默认值是-1,所以所有新建立的用户密码都不会失效。
如 10 代表密码过期后 10 天后失效;如果是 0,代表密码过期后立即失效;如果是-1,则代表密码永
远不会失效。这里默认值是-1,所以所有新建立的用户密码都不会失效。
EXPIRE=
这个选项是密码失效时间,也就是/etc/shadow 文件的第八个字段。也就说用户到达这个日期后
就会直接失效。当然这里也是使用时间戳来表示日期的。默认值是空,所以所有新建用户没有失效时
间,永久有效。
就会直接失效。当然这里也是使用时间戳来表示日期的。默认值是空,所以所有新建用户没有失效时
间,永久有效。
SHELL=/bin/bash
这个选项是用户的默认 shell 的。/bin/bash 是 Linux 的标志 shell,所以所有新建立的用户默
认都具备 shell 赋予的权限。
认都具备 shell 赋予的权限。
SKEL=/etc/skel
这个选项就是定义用户的模板目录的位置,/etc/skel/目录中的文件都会复制到新建用户的家目
录当中。
录当中。
CREATE_MAIL_SPOOL=yes
这个选项定义是否给新建用户建立邮箱,默认是创建,也就是说所有的新建用户系统都会新建一
个邮箱,放在/var/spool/mail/下和用户名相同。
个邮箱,放在/var/spool/mail/下和用户名相同。
2)/etc/login.defs
[root@localhost ~]# vi /etc/login.defs
#这个文件有些注释,把注释删除掉,文件内容就变成下面这个样子了
MAIL_DIR /var/spool/mail
PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
PASS_MIN_LEN 5
PASS_WARN_AGE 7
UID_MIN 500
UID_MAX 60000
GID_MIN 500
GID_MAX 60000
CREATE_HOME yes
UMASK 077
USERGROUPS_ENAB yes
ENCRYPT_METHOD SHA512
#这个文件有些注释,把注释删除掉,文件内容就变成下面这个样子了
MAIL_DIR /var/spool/mail
PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
PASS_MIN_LEN 5
PASS_WARN_AGE 7
UID_MIN 500
UID_MAX 60000
GID_MIN 500
GID_MAX 60000
CREATE_HOME yes
UMASK 077
USERGROUPS_ENAB yes
ENCRYPT_METHOD SHA512
MAIL_DIR /var/spool/mail
这行指定了新建用户的默认邮箱位置。比如 user1 用户的邮箱是就是/var/spool/mail/user1
PASS_MAX_DAYS 99999
这行指定的是密码的有效期,也就是/etc/shadow 文件的第五字段。代表多少天之后必须修改密
码,默认值是 99999。
码,默认值是 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 方式加密
2 设定密码
[root@localhost ~]#passwd [选项] 用户名
选项:
-l: 暂时锁定用户。仅 root 用户可用
-u: 解锁用户。仅 root 用户可用
--stdin: 可以将通过管道符输出的数据作为用户的密码。主要在批量添加用户时使用
选项:
-l: 暂时锁定用户。仅 root 用户可用
-u: 解锁用户。仅 root 用户可用
--stdin: 可以将通过管道符输出的数据作为用户的密码。主要在批量添加用户时使用
[root@localhost ~]#passwd
#passwd 直接回车代表修改当前用户的密码
#passwd 直接回车代表修改当前用户的密码
root用户可以修改其他用户的密码,而普通用户不能修改其他用户的密码
普通用户修改自身的密码,只需要passwd 命令就行
也可以使用字符串作为密码:
[root@localhost ~]# echo "123" | passwd --stdin user1
更改用户 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)
选项:
-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: 在删除用户的同时删除用户的家目录
选项:
-r: 在删除用户的同时删除用户的家目录
5 切换用户身份
su 命令可以切换成不同的用户身份,命令格式如下:
[root@localhost ~]# su [选项] 用户名
选项:
-: 选项只使用“-”代表连带用户的环境变量一起切换
-c 命令:切换身份后,仅执行一次命令,然后在返回当前身份
-s 类似于-c 是执行脚本文件
选项:
-: 选项只使用“-”代表连带用户的环境变量一起切换
-c 命令:切换身份后,仅执行一次命令,然后在返回当前身份
-s 类似于-c 是执行脚本文件
“-”不能省略,它代表切换用户身份时,用户的环境变量也要切换成新用户的环境变量。
REDHAT5 之前的版本,如果不加 “-”就无法使用root用户下的命令,REDHAD6之后可以使用
exit可以退出所切换的目录
超级用户切换普通用户,不需要输入密码
相反则需要密码
三 、组管理命令
1 添加用户组:groupadd
添加用户组的命令是 groupadd,命令格式如下:
[root@localhost ~]# groupadd [选项] 组名
选项:
-g GID: 指定组 ID
选项:
-g GID: 指定组 ID
添加用户组的命令比较简单,举个例子:
[root@localhost ~]# groupadd group1
#添加 group1 组
[root@localhost ~]# grep "group1" /etc/group
group1:x:502:
#添加 group1 组
[root@localhost ~]# grep "group1" /etc/group
group1:x:502:
2 删除用户组:groupdel
groupdel 命令用于删除用户组,命令格式如下:
[root@localhost ~]#groupdel 组名
例子:
例子:
[root@localhost ~]#groupdel testgrp
#删除 testgrp 组
#删除 testgrp 组
不过大家要注意,要删除的组不能是其他用户的初始组,也就是说这个组中没有初始用户才可以
删除。如果组中有附加用户,则删除组时不受影响。
删除。如果组中有附加用户,则删除组时不受影响。
4 把用户添加进组或从组中删除:gpasswd
其实 gpasswd 命令是用来设定组密码并指定组管理员的,不过我们在前面已经说了,组密码和组
管理员功能很少使用,而且完全可以被 sudo 命令取代,所以 gpasswd 命令现在主要用于把用户添加
进组或从组中删除。命令格式如下:
管理员功能很少使用,而且完全可以被 sudo 命令取代,所以 gpasswd 命令现在主要用于把用户添加
进组或从组中删除。命令格式如下:
[root@localhost ~]# gpasswd [选项] 组名
选项:
-a 用户名: 把用户加入组
-d 用户名: 把用户从组中删除
选项:
-a 用户名: 把用户加入组
-d 用户名: 把用户从组中删除
[root@localhost ~]# groupadd grouptest
#添加组 grouptest
[root@localhost ~]# gpasswd -a user1 grouptest
Adding user user1 to group grouptest
#把用户 user1 加入 grouptest 组
[root@localhost ~]# grep "user1" /etc/group
user1: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/group
grouptest:x:505:
#组中没有 user1 用户了
#添加组 grouptest
[root@localhost ~]# gpasswd -a user1 grouptest
Adding user user1 to group grouptest
#把用户 user1 加入 grouptest 组
[root@localhost ~]# grep "user1" /etc/group
user1: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/group
grouptest:x:505:
#组中没有 user1 用户了
大家注意,也可以使用 usermod 命令把用户加入某个组,不过 usermod 命令的操作对象是用户,
命令是“usermod -G grouptest user1”,把用户名作为参数放在最后;而 gpasswd 命令的操作对象
是组,命令是“gpasswd -a user1 grouptest”,把组名作为参数放在最后。
命令是“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 组。命令如下:
初始组。我们再把 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 group1
Adding user user1 to group group1
#把 user1 用户加入 group1 组
[root@localhost ~]# grep "user1" /etc/group
user1: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 组
#添加组 group1
[root@localhost ~]# gpasswd -a user1 group1
Adding user user1 to group group1
#把 user1 用户加入 group1 组
[root@localhost ~]# grep "user1" /etc/group
user1: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 命令可以在多个组身份之间切换。
效。使用 newgrp 命令可以在多个组身份之间切换。
6. 组权限实验
0 条评论
下一页