24 AUG
14.2.1 新增与删除用户: useradd, 相关配置文件, passwd, usermod, userdel
useradd [-u UID] [-g 初始用户组] [-G 次要用户组] [-mM] [-c 说明栏] [-d 主文件夹绝对路径] [-s shell] 用户账号名
一般新建文件夹之后会默认创建一个与账号一模一样的用户组名;默认会创建用户主文件夹。一般可以直接用useradd accountName
来创建就好了。
CentOS默认值会帮我们处理一下几个项目:
- 在
/etc/passwd
里面创建一行与账号相关的数据,包括创建UID/GID/主文件夹等 - 在
/etc/shadow
里面将此账号的密码相关参数填入,但是尚未有密码 - 在
/etc/group
里面加入一个与账号名称一模一样的组名 - 在
/home
下面创建一个与账号同名的目录作为用户住文件夹,且权限为700.
eg. 用users作为初始用户组,以及uid为700创建一个名为vbird2的账号(已知系统中有一个用户组users已存在,且uid700不存在)
useradd -u 700 -g users vbird2
eg. 创建一个系统账号,名称为vbird3
useradd -r vbird3
(系统账号的UID小于500,且系统账号默认不会主动创建文件夹)
30 AUG
useradd参考文件(默认值):useradd -D
,在/etc/default/useradd
中
使用useradd创建账号之后,默认情况下,该账号是暂时被封锁的(无法登陆),此时应该设置一下新密码,才可以登录:passwd username
,只使用passwd
表示修改自己这个当前用户的密码。
eg. 让liangst的账号失效:
passwd -l liangst
#Looking password for user liangst
passwd -S liangst
查看账号liangst
grep liangst /etc/shadow
发现密码栏多了两个“!”而已
passwd -u liangst
#Unlock password for user liangst
- chage
chage -l liangst
列出该用户的详细密码参数
eg.
让用户在第一次登录时强制他们一定要更改密码后才能使用系统资源:
useradd newuser
创建一个新用户username
echo "username" | passwd --stdin newuser
#令username作为新用户newuser的密码
chage -d 0 agetest
#此时账号的密码新建时间会被改为1970/1/1, 所以会被要求强制修改密码。(第一次登录可以用账号同名的密码登录)
usermod : 用于修改使用
useradd
的时候加入了一些错误设置,可以对已存在账号进行相关数据的微调。它的使用方法及参数和useradd
类似.
(refer to P416)userdel:用于删除用户的相关数据,包括:
- 用户账号/密码相关参数-
/etc/passwd
,/etc/shadow
- 用户组相关参数-
/etc/group
,/etc/gshadow
- 用户个人文件数据-
/home/username
,/var/spool/mail/username
- 用户账号/密码相关参数-
用法: userdel [-r] username
#-r表示连同用户的主文件夹一起删除。
删除之前注意,先执行一下find / -user username
查出整个系统内属于username的文件,然后再执行userdel -r username
14.2.2 用户功能
由于useradd, usermod, userdel都是系统管理员所能够使用的命令。那这里介绍几个一般身份用户常用的账号数据更改与查询命令。
finger. 用于查阅用户信息
利用某用户新建自己的计划文档
echo "I will study Linux during this year." > ~/.plan
chfn 用来修改用户的相关信息,如,办公室房间号码,电话号码之类的。
- chsh: change shell的简写.
-l
列出目前系统上面可用的shell,其实就是/etc/shells
的内容-s
设置修改自己的shell
- id : 查询某人或者自己相关的UID/GID等信息。eg
id username
. 使用这个命令也可以用来判断系统上面有没某个账号。
14.2.3 新增与删除用户组
groupadd [-g gid] [-r] group_name
- -g 后面接某个特定的GID, 用来直接给予某个GID
- -r 新建系统用户组。
groupmod [-g gid] [-n new_group_name] group_name
- -g gid 用来修改用户组GID
- -n new_group_name用来修改用户组名称
groupdel [group_name]
注意不能删除某用户的初始用户组。必须要确认/etc/passwd内的账号没有任何人使用该用户组作为初始用户组才行。gpasswd
用户组管理员功能,可以管理哪些账号可以加入/移出该用户组- 如何新建一个用户组管理员?
1 系统管理员root做的操作:
gpasswd groupname
gpasswd [-A user1,...] [-M user3,...] groupname
gpasswd [-rR] groupname
-A 表示将groupname的主控权交由后面的用户管理(该用户组的管理员)
-M 表示将某些账号加入这个用户组中
-r 表示将groupname的密码删除
-R 表示让groupname的密码栏失效2 用户组管理员做的操作:(切换到用户管理员登录)
gpasswd [-ad] user groupname
#-a为add, -d为delete
注意:有可能用户组管理员不在该用户组内。3 可以用
grep mygroup /etc/group
查看是否添加用户组成员成功。4 可以用
newgrp othergroup
来切换当前用户组(针对有multi-group的用户)- 如何新建一个用户组管理员?
14.3 主机的具体权限规划: ACL的使用
ACL: Access Control List, 目的为提供传统的owner, group, others 的rwx权限之外的具体权限设置。 ACL可以针对单一用户、单一文件或目录来进行r,w,x的权限设置。
查看本系统是否支持ACL功能:
mount #查看挂载参数
dumpe2fs -h dev/sda1 | grep acl #查看是否支持ACL
mount -o remount,acl / #加入ACL支持
14.3.3 ACL的设置技巧:getfacl, setfacl
- getfacl: 取得某个文件/目录的ACL设置项目
- setfacl:设置某个目录/文件的ACL规定
如何设置ACL的特殊权限?
- 针对单一用户的设置方法
- setfacl
创建一个测试文件acl_test1,其权限是644
设置rx权限给用户liangst
setfacl -m u::rwx acl_test1
两个“:”中间没有user字段,代表设置该文件所有者,所以显示root的权限变成rwx了。
- setfacl
总结,以上是最简单的ACL设置,利用“u:用户:权限”的方式进行设置。-m表示:设置后续的acl参数给文件使用;-x表示:删除后续的acl参数。
getfacl
如果一个文件设置了ACL参数后,它的权限部分就会多出一个+号,但是此时看到的权限与实际权限可能会有误差,此时可以通过getfacl
来查看。
getfacl acl_test1
mask 表示此文件默认的有效权限
31 AUG
- 针对特定用户组的方式
设置规范:”g:[用户组列表]:[rwx]”, eg setfacl -m g:mygroup:rx acl_test1
, 然后查看
针对有效权限mask的设置方式
设置规定:”m:[rwx]”
意义:即“有效权限”,用户或组所设置的权限必须要存在于mask的权限设置范围内才会生效 - effective permission。取user或group与mask的交集才是实际得到的权限。
作用:通过使用mask来规定最大允许的权限,就能避免不小心开放某些权限给其他用户或用户组。我们发现,获得ACL设置的文件夹,其子文件夹并没有继承父文件夹的ACL属性,所以可以通过以下设置使得ACL属性在目录下面的数据都有继承的功能:
- 设置规范:“d:[ug]:用户列表:[rwx]”
- 设置规范:“d:[ug]:用户列表:[rwx]”
如果要删除所有的ACL设置参数,通过
setfacl -b filename
即可。
14.4 用户身份切换
14.4.4 su
su [-lm] [-c 命令] username
eg.
切换到root:
su -
-
表示使用login-shell的变量文件读取方式来登陆系统。注意不推荐单纯使用su
切换为root的身份,因为这样读取的变量设置方式为non-login shell的方式,这种方式下很多原本的变量不会被改变(如环境变量env
)只执行一个只有root才能进行的命令:
su - -c "head -n 3 /etc/shadow"
这里-c后面接的就是一句命令。进行完这个命令之后还是继续用就的身份继续操作。切换到某些特殊账号:
su -l dmtsai
,su -l sshd
- 或者可以使用:
su - username
切换到root时,普通用户需要知道密码,这不安全。此时可以考虑使用sudo。
14.4.2 sudo
sudo的执行只需要自己的密码即可。由于sudo可以让普通用户以root(或其他用户)的身份执行,因此并非所有人都能执行sudo,而是仅有/etc/sudoers内的用户才能够执行sudo这个命令。
运行
sudo XXXX
的时候,遇到问题: “XXX is not in the sudoers file. This incident will be reported.”
http://jingyan.baidu.com/article/2a1383284bb3e8074a134f2d.html
Solution:
su - root
visudo
----在下面添加一行xxx ALL=(ALL) ALL 其中xxx为用户名称
root ALL=(ALL) ALL
用户账号 登录者的来源主机名=(可切换的身份) 可执行的命令
#其中可执行的命令务必使用绝对路径编写。
sudo命令用法:sudo [-b] [-u 新用户账号]
-b : 将后续的命令让系统自动执行,而不与目前的shell产生影响
-u : 后面可以接欲切换的用户,若无此项则代表切换身份为root
eg. 以sshd用户的权限在/tmp文件夹下新建一个名为mysshd的文件
用test1的身份新建~test1/www 并在其中新建index.html文件
这里通过sh一串命令行实现:
sh -c "一串命令" #注意“一串命令”里面不能用“”双引号,只能用‘’单引号
sudo可以让你切换身份来进行某项任务。我们无法使用“su - sshd”去切换系统账号(因为系统账号的shell是/sbin/nologin),这个时候sudo就很好用了!
利用用户组以及免密码功能处理visudo
visudo #先用root身份对/etc/sudoerds进行设置
#看到以下信息
%wheel ALL=(ALL) ALL
#%后面的wheel指用户组的名称,可以选择把某些用户加入到wheel用户组,也可以选择把wheel改成自己的用户组名
#修改结束后所有组内成员都可以用sudo执行root权限了
- 不需要密码即可使用sudo
visudo
%wheel ALL=(ALL) NOPASSWD:ALL
#针对wheel用户组里的所有用户都不需要输入密码
- 有限制的命令操作
限制一般用户仅能够进行部分系统任务。
visudo
myuser1 ALL=(root) /usr/bin/passwd #路径务必使用绝对路径
#然而这样会有可能让一般用户可以修改root用户的密码,所以还要修改
myuser1 ALL=(root) !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root
# "!"表示不可执行的意思
前面的例子代表除了passwd
和passwd root
命令之外,可以执行passwd 任意字符
- 通过别名设置visudo
visudo
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
通过User_Alias新建一个新账号(一定要使用大写字符处理)。将来要修改的时候,只需要修改User_Alias以及Cmnd_Alias这两行即可,在设置方面会比较简单而且有弹性
- sudo 搭配su的使用方式
User_Alias ADMINS = pro1, pro2, pro3, myuser1
ADMINS ALL= (root) /bin/su -
账号别名的四位用户,只要输入 sudo su - 并且输入自己的密码后,立刻变成root身份。
14.5 用户的特殊shell与PAM模块
14.5.1 特殊的shell, /sbin/nologin
利用/etc/nologin.txt告知用户不要利用该账号登录系统
>vim /etc/nologin.txt
This account is system account or mail account.
Please DO NOT use this account to login my Linux server.
测试:
14.5.2 PAM模块简介
PAM: Pluggable Authentication modules 嵌入式模块
PAM是一套应用程序编程接口(API),它提供了一连串的验证机制,只要用户将验证阶段的需求告知PAM后,PAM就能够回复用户验证的结果(成功或失败)。可以供其他任何程序调用,让账号密码或者其他方式的验证具有一致的结果。
- /var/log/secure, /var/log/messages
如果发生任何无法登录或者无法预期的错误时, 由于PAM模块都会将数据记载在/var/log/secure当中,所以可以去以上两个文件中进行trouble shooting。
14.6.1 查询用户:w,who,last,lastlog
who,w :查看目前已登录在系统上面的用户
lastlog: 查询每个账号的最近登录时间。lastlog命令会去读取/var/log/lastlog文件
14.6.2 用户对谈write, mesg, wall
write
write 可以直接将信息传给接收者
write 用户账号 [用户所在终端接口]
mesg [n/y] 拒绝/接收消息
- wall “…………….” 对所有系统上面的用户传送广播信息
注意 使用wall, write要等到用户在线才能够进行.