第14章 Linux账号管理与ACL权限设置

时间:2021-08-06 10:01:40

Linux的账号与用户组

用户标识符:UID与GID

每一个文件都有一个所有者ID和用户组ID,当我们需要查看文件属性时,系统会根据/etc/passwd和/etc/group的内容,找到对应UID和GID对应的账户名和组名。

用户账号

用户的登陆流程如下:

1. 先搜索/etc/passwd里面是否有你输入的账号,如果有则将用户名对应的UID和GID(GID在/etc/group内)读取出来

2. 进入/etc/shadow找到对应账户与UID,核对密码是否正确

/etc/passwd文件结构

该文件每一行代表一个账户。每一行共有七个字段,分别如下:

1. 账号名称

2. 密码  密码数据放在/etc/shadow,故该字段显示x

3. UID  0表示系统管理员,1-499为系统账户,500~65535为可登录账号

4. GID  

5. 用户信息说明列  用来说明账号的意义

6. 主文件夹

7. Shell

/etc/shadow文件结构

1. 账号名称

2. 密码  

3. 最近更改密码的日期  从1970.1.1开始的天数

4. 密码不可被更改的天数

5. 密码需要被重新更改的天数

6. 密码需要更改期限前的警告天数

7. 密码过期后的账号宽限时间

8. 账号失效时间

9. 保留

有效与初始用户组:groups,newgrp

/etc/group文件结构

1. 用户组名称

2. 用户组密码  密码已放到/etc/gshadow

3. GID

4. 此用户组支持的账户名称  多个用户名逗号隔开

有效用户组与初始用户组

每个用户在/etc/passwd的第四列都有一个GID,该ID表示初始用户组。如果用户wuchao同时支持group1和group2两个用户组,那么该用户新建文件时,文件的用户组要取决于有效用户组。

以下举例:

将用户名wuchao加入到用户组root中去

[wuchao@localhost 桌面]$ usermod -a -G root wuchao

查看用户wuchao所支持的用户组:第一个为有效用户组

[wuchao@localhost 桌面]$ groups
wuchao root
[wuchao@localhost 桌面]$

创建文件并查看文件的用户组

[wuchao@localhost 桌面]$ touch file1
[wuchao@localhost 桌面]$ ls -l file1
-rw-rw-r--. wuchao wuchao 7月 : file1
[wuchao@localhost 桌面]$

切换有效用户组:newgrp 用户组名

[wuchao@localhost 桌面]$ newgrp root
[wuchao@localhost 桌面]$ groups
root wuchao
[wuchao@localhost 桌面]$ touch file2
[wuchao@localhost 桌面]$ ls -l file2
-rw-r--r--. wuchao root 7月 : file2
[wuchao@localhost 桌面]$

注意:使用newgrp其实是进入了一个新的shell,使用exit指令退出该新的shell,返回原来的shell,你会发现原来的shell的用户组并没有改变。如下:

[wuchao@localhost 桌面]$ newgrp root
[wuchao@localhost 桌面]$ groups
root wuchao
[wuchao@localhost 桌面]$ exit
exit
[wuchao@localhost 桌面]$ groups
wuchao root
[wuchao@localhost 桌面]$

/etc/gshadow

共有四个字段。

1. 用户组名

2. 密码列  如果以!开头表示无用户组管理员

3. 用户组管理员的账号

4. 该用户组所属账号

用户组管理员:当用户想加入某个用户组时可能需要root用户来操作,如果root用户很繁忙,可以为每个用户组创建用户组管理员,用户组管理员可以将其他账号加入到自己管理的用户组去。

账号管理

新增与删除用户:useradd,相关配置文件,passwd,usermod,userdel

useradd

useradd [-u UID] [-g 初始化用户组] [-G 次要用户组] [-c 说明栏] [-d 主文件夹绝对路径] [-s shell] 用户名

//添加新用户
[root@localhost 桌面]# useradd fw
[root@localhost 桌面]# ls -d /home/fw
/home/fw //查看添加结果
[root@localhost 桌面]# grep fw /etc/passwd /etc/shadow /etc/group
/etc/passwd:fw:x::::/home/fw:/bin/bash
/etc/shadow:fw:!!:::::::
/etc/group:fw:x::
[root@localhost 桌面]#

注:添加用户后还需要使用passwd指令设置用户密码

passwd

可以使用--stdin参数方便设置密码,例如:

[root@localhost 桌面]# echo "password" | passwd --stdin myuser3

以上代码可以将用户myuser3的密码设为password

[root@localhost 桌面]# passwd fw
更改用户 fw 的密码 。
新的 密码:
无效的密码: 密码少于 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@localhost 桌面]#

chage

查看或设置用户密码的详细信息

chage [-ldEImMW] 账户名

参数:

-l:列出密码详细信息

-d:后面接日期,修改shadow第三个字段(最近一次更改密码的日期),格式YYYY-MM-DD

-E:后面接日期,修改shadow第八个字段(账号失效日),格式YYYY-MM-DD

-I:后面接天数,修改shadow第七个字段(密码失效日)

-m:后面接天数,修改shadow第四个字段(密码最短保留天数)

-M:后面接天数,修改shadow第五个字段(密码多久需要进行更改)

-W:后面接天数,修改shadow第六个字段(密码过期前警告日期)

[root@localhost 桌面]# chage -l fw
最近一次密码修改时间 :7月 ,
密码过期时间 :从不
密码失效时间 :从不
帐户过期时间 :从不
两次改变密码之间相距的最小天数 :
两次改变密码之间相距的最大天数 :
在密码过期之前警告的天数 :
[root@localhost 桌面]# //设置账号 失效日期
[root@localhost 桌面]# chage -E 2017-01-01 fw
[root@localhost 桌面]# chage -l fw
最近一次密码修改时间                    :7月 20, 2016
密码过期时间                    :从不
密码失效时间                    :从不
帐户过期时间                        :1月 01, 2017
两次改变密码之间相距的最小天数        :0
两次改变密码之间相距的最大天数        :99999
在密码过期之前警告的天数    :7
[root@localhost 桌面]#

usermod

usermod [-cdegGIsuLU] 用户名

参数:

-c:后面接账号的说明

-d:后面接账号的主文件夹名

-e:后面接日期,格式YYYY-MM-DD,账号失效日期

-f:后面接天数,密码失效时间

-g:后面接初始用户组

-G:后面接次要用户组

-a:与-G合用用来增加次要用户组而非设置

-l:后面接账号名称,修改账号名称

-s:后面接shell的实际文件

-u:后面接UID数字

-L:暂时冻结用户的密码

-U:将/etc/shadow密码列的!去掉

userdel

userdel [-r] username

参数:

-r:连同用户的主文件夹一起删除

新增与删除用户组

groupadd

groupadd [-g gid] [-r] groupname

参数:

-g:GID设置

-r:新建系统用户组

groupmod

groupmod [-g gid] [-n group_name] groupname

参数:

-g:修改GID

-n:修改用户组名

groupdel

groupdel [groupname]

注:如果要删除的用户组已被已有的账号设置为初始用户组的话,则该用户组无法删除。

gpasswd

用户组管理功能,虽然可以使用系统管理员来管理用户组的用户账号,但也可以设置该用户组的管理员,让其管理账户加入或移除该用户组

gpasswd groupname:设置用户组密码

gpasswd [-A user1,user2,...] [-M user3,user4,...] groupname

gpasswd [-rR] groupname

gpasswd [-ad] user groupname

参数:

-A:将该用户组的主控权交给后面的这些用户管理

-M:将某些账号加入用户组

-r:将groupname的密码删除

-R:让groupname密码栏失效

-a:添加用户到该用户组

-d:从该用户组移除用户

//新建用户组,并设置密码
[root@localhost 桌面]# groupadd group1
[root@localhost 桌面]# gpasswd group1
正在修改 group1 组的密码
新密码:
请重新输入新密码: //将wuchao设为该用户组的管理员
[root@localhost 桌面]# gpasswd -A wuchao group1 //查看结果
[root@localhost 桌面]# grep group1 /etc/group /etc/gshadow
/etc/group:group1:x::
/etc/gshadow:group1:$$KKooal1l2VJIq1J/$QR269hLIOp8B6e/g/BoB53zj5RWxk1kIznSkvAywxtixAvu1zcjGxnYM4leHiJ5i4QKYju/DD9tZS/upvSNyw1:wuchao:
[root@localhost 桌面]# //切换wuchao登陆
//可以看出,wuchao未加入group1
[wuchao@localhost 桌面]$ id
uid=(wuchao) gid=(wuchao) 组=(wuchao),(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 //因为wuchao具有group1这个用户组的管理员身份,故可以操作该用户组
//将wuchao自己加入到该组
[wuchao@localhost 桌面]$ gpasswd -a wuchao group1
正在将用户“wuchao”加入到“group1”组中 //将其他账号fw加入到该用户组
[wuchao@localhost 桌面]$ gpasswd -a fw group1
正在将用户“fw”加入到“group1”组中 //查看结果
[wuchao@localhost 桌面]$ grep group1 /etc/group
group1:x::wuchao,fw
[wuchao@localhost 桌面]$

账号管理实例

任务一:

账号名称 账号全名 支援次要用户组 是否可以登录主机 密码
myuser1 1st user mygroup1 可以 password
mysuer2 2nd user mygroup2 可以 password
myuser3 3rt user 不可以 password

指令如下:

[root@localhost 桌面]# groupadd mygroup1
[root@localhost 桌面]# useradd -G mygroup1 -c "1st user" myuser1
[root@localhost 桌面]# useradd -G mygroup1 -c "2nd user" myuser2
[root@localhost 桌面]# useradd -c "3rd user" -s /bin/nologin myuser3
[root@localhost 桌面]#
[root@localhost 桌面]# echo "password" | passwd --stdin myuser1
更改用户 myuser1 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@localhost 桌面]# echo "password" | passwd --stdin myuser2
更改用户 myuser2 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@localhost 桌面]# echo "password" | passwd --stdin myuser3
更改用户 myuser3 的密码 。
passwd:所有的身份验证令牌已经成功更新。

因为用户myuser3是不可登陆用户,则设置shell为/bin/nologin

任务二:

用户pro1,pro2,pro3是三个开发人员,让他们在/srv/projecta目录下开发

[root@localhost 桌面]# groupadd projecta
[root@localhost 桌面]# useradd -G projecta -c "projecta user" pro1
[root@localhost 桌面]# useradd -G projecta -c "projecta user" pro2
[root@localhost 桌面]# useradd -G projecta -c "projecta user" pro3
[root@localhost 桌面]# echo "password" | passwd --stdin pro1
更改用户 pro1 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@localhost 桌面]# echo "password" | passwd --stdin pro2
更改用户 pro2 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@localhost 桌面]# echo "password" | passwd --stdin pro3
更改用户 pro3 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@localhost 桌面]#
[root@localhost 桌面]# mkdir /srv/projecta
[root@localhost 桌面]# chgrp projecta /srv/projecta
[root@localhost 桌面]# chmod /srv/project
chmod: 无法访问"/srv/project": 没有那个文件或目录
[root@localhost 桌面]# chmod /srv/projecta
[root@localhost 桌面]# ls -dl /srv/projecta
drwxrws---. root projecta 7月 : /srv/projecta
[root@localhost 桌面]#

注:权限2770表示设置SGID,如果一个目录设置了SGID位,那么如果任何一个用户对这个目录有写权限的话,他在这个目录所建立的文件的组都会自动转为这个目录的属主所在的组,而文件所有者不变,还是属于建立这个文件的用户。这样的话,无论用户组中哪个用户创建的文件,该用户组的其他用户也可以修改,这在项目开发中很有用。

主机的具体权限规划:ACL的使用

什么是ACL

ACL(access control list)的主要目的是提供传统的owner,group,others的read,write,execute权限之外的具体权限设置。ACL可以针对单一用户、单一文件或目录来进行r,w,x的权限设置。

ACL的设置技巧:getfacl,setfacl

getfacl:取得文件或目录的ACL设置

setfacl:设置文件或目录的ACL规定

setfaclc [-bkRd] [{-m|-x} acl参数] 目标文件名

参数:

-m:设置后续的acl参数给文件,不可与-x合用

-x:删除后续的acl参数,不可与-m合用

-b:删除所有的acl参数

-k:删除默认的acl参数

-R:递归设置acl,即同时设置子目录

-d:设置默认acl,只对目录有效,该目录新建的文件都会引用此默认值

[root@localhost 桌面]# touch acl_test
[root@localhost 桌面]# ls -l acl_test
-rw-r--r--. root root 7月 : acl_test
[root@localhost 桌面]# setfacl -m u:wuchao:rx acl_test
[root@localhost 桌面]# ls -l acl_test
-rw-r-xr--+ root root 7月 : acl_test
[root@localhost 桌面]# getfacl acl_test
# file: acl_test
# owner: root
# group: root
user::rw-
user:wuchao:r-x
group::r--
mask::r-x
other::r-- [root@localhost 桌面]#

设置acl后,看到的权限和实际权限有点误差,并且权限后面多了个+,通过getfacl指令查阅实际的权限。

mask为有效权限,表示用户或组所设置的权限必须要存在于mask的权限设置范围内才会生效。举例:

[root@localhost 桌面]# setfacl -m m:r acl_test
[root@localhost 桌面]# getfacl acl_test
# file: acl_test
# owner: root
# group: root
user::rw-
user:wuchao:r-x #effective:r--
group::r--
mask::r--
other::r-- [root@localhost 桌面]#

上面用户wuchao显示#effective:r--表示仅仅只有r属性有效

用户身份切换

su

su [-lm] [-c 命令] [username]

参数:

-:单纯使用“su -”代表使用login shell切换用户,不加用户名则切换为root

-l:后面加需要切换的账号,login shell方式

-m:使用当前环境配置,不读取新用户的配置文件

-c:仅进行一次命令

//使用su表示读取变量的方式是nologin shell,此时很多变量不会改变,比如PATH
[wuchao@localhost 桌面]$ su
密码:
[root@localhost 桌面]# id
uid=(root) gid=(root) 组=(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[root@localhost 桌面]# env | grep 'wuchao'
USER=wuchao
USERNAME=wuchao
PATH=/usr/local/java/jdk1..0_91/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/wuchao/.local/bin:/home/wuchao/bin
MAIL=/var/spool/mail/wuchao
PWD=/home/wuchao/桌面
LOGNAME=wuchao
[root@localhost 桌面]# exit
exit //使用su - 则用login shell方式读取
[wuchao@localhost 桌面]$ su -
密码:
上一次登录:四 7月 :: CST 2016pts/ 上
[root@localhost ~]# env | grep root
USER=root
MAIL=/var/spool/mail/root
PATH=/usr/local/java/jdk1..0_91/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
HOME=/root
LOGNAME=root
XAUTHORITY=/root/.xauthe6Zrco
[root@localhost ~]# exit
登出
[wuchao@localhost 桌面]$

sudo

仅有/etc/sudoers内的用户才能使用该指令

sudo的命令用法

sudo [-b] [-u 新用户]

参数:

-b:将后续的命令让系统执行,而不与目前的shell产生影响

-u:后面可以接要切换的用户,若无此项代表切换到root

//使用sshd用户创建文件
[root@localhost 桌面]# sudo -u sshd touch /tmp/mysshd
[root@localhost 桌面]# ls -l /tmp/mysshd
-rw-r--r--. sshd sshd 7月 : /tmp/mysshd //使用其他用户执行命令
[root@localhost 桌面]# sudo -u wuchao sh -c "mkdir ~wuchao/www;cd ~wuchao/www;\
> echo 'this is index.html ' > index.html"
[root@localhost 桌面]# ls -al ~wuchao/www
总用量
drwxr-xr-x. wuchao wuchao 7月 : .
drwx------. wuchao wuchao 7月 : ..
-rw-r--r--. wuchao wuchao 7月 : index.html
[root@localhost 桌面]#

注:sshd用户是系统账户(默认shell是/sbin/nologin),故无法使用su切换到该用户,但可以使用sudo -u sshd

sh -c  string可以执行一系列指令

visudo与/etc/sudoers

单一用户:

[root@localhost 桌面]# visudo

//修改下面内容
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
wuchao ALL=(ALL) ALL

四个参数的意义:

1. 用户账号  系统的哪个账号可以使用sudo

2. 登陆者的来源主机

3. 可切换的身份

4. 可执行的命令

利用用户组以及免密码的功能visudp

[root@localhost 桌面]# groupadd group1
groupadd:“group1”组已存在
[root@localhost 桌面]# visudo //添加用户组group1
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
%group1 ALL=(ALL) ALL

免密码功能

## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
%group1 ALL=(ALL) NOPASSWD:ALL

有限制的命令操作

## Allow root to run any commands anywhere
root ALL=(ALL) ALL
wuchao ALL=(root) !/usr/bin/passwd,/usr/bin/passwd [A-Za-z]*,!/usr/bin/pas
swd root

注:!标志不可执行。上述配置表示wuchao可以执行“passwd 任意字符”,但不可执行passwd和passwd root,这样wuchao便不能更改root的密码

用户的特殊shell与PAM模块

暂时跳过去。

Linux主机上的用户信息传递

查询用户:w,who,last,lastlog

[root@localhost 桌面]# w
:: up days, :, users, load average: 0.40, 0.28, 0.33
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root : : 三14 ?xdm? :24m .08s gdm-session-wor
root pts/ : : .00s .08s .03s w
wuchao : : : ?xdm? :24m .05s gdm-session-wor
[root@localhost 桌面]# who
root : -- : (:)
root pts/ -- : (:)
wuchao : -- : (:)
(unknown) : -- : (:)
(unknown) : -- : (:)
(unknown) : -- : (:)
[root@localhost 桌面]#

用户对谈:write,mesg,wall

省略。

用户信箱:mail

用户信箱所在位置为/var/spool/mail/用户名

//写邮件,最后输入小数点,点击enter结束
[root@localhost 桌面]# mail wuchao -s "nice to meet you"
Subject: hello,wuchao. I am root .
EOT
[root@localhost 桌面]# //wuchao登陆,输入mail即可接收邮件
[wuchao@localhost 桌面]$ mail
Heirloom Mail version 12.5 //. Type ? for help.
"/var/spool/mail/wuchao": message new
>N root Thu Jul : / "hello,wuchao. I am ro"
&