知识
账号管理中的一些文件结构
/etc/passwd
每一行的内容都为下面结构
账号名称:密码:UID:GID:用户信息说明:家目录:shell
---- UID ----
-- 0 -> 代表系统管理员
-- 1~499 -> 系统保留账号,这些系统账号不可登录,shell为/sbin/nologin
---- 1~99 -> 由distributions自行建立的系统账号
---- 100~499 -> 用户可以使用的系统账号
-- 500~65535 -> 给一般使用者用,一般具有可登录shell
/etc/shadow
每一行的内容都为下面结构
账号名称:密码:最近更改密码的日期:密码不可被更改的天数:必须需要重新变更的天数:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效日期:保留
-- 第3个字段>最近更改密码的日期
---- 从1970年1月1日累积的天数
-- 第4个字段>密码不可被更改的天数
---- 密码更改后,多少天内不能更改密码
-- 第5个字段>密码需要重新变更的天数
---- 密码更改后,多少天后必须重新更改
-- 第6个字段>密码需要变更前的警告天数
---- 再过这些天密码就要过期了
-- 第7个字段>密码过期后的宽限时间
---- 密码过期后还能用多少天
-- 第8个字段>面失效的日期
----从1970年1月1日累积的天数
/etc/group
每一行代表一个群组,结构如下
组名:群组密码:GID:群组支持的账号
-- 群组密码一般放在/etc/gshadow中,因此此处为x
/etc/gshadow
每一行的结构如下
组名:密码:群组管理员的username:该群组的user
-- 若密码以 ! 开头,表示无合法密码,所以无群组管理员
/etc/sudoers
-- 格式例子
root ALL(ALL) ALL
-- 用户设定格式如下
使用者账号 登入者的来源主机名(可切换的身份) 可下达的指令
-- 群组设定格式如下
%群组 登入的来源主机名(可切换的身份) 可下达的命令
-- 不需要面的设定方式
root ALL(ALL) NOPASSWD:ALL
-- 限定指令
user ALL=(root) !/usr/bin/passwd,/usr/bin/passwd [A-Za-z],!/usr/bin/passwd root
---- 其中 ! 代表不可执行
--使用别名
User_Alias USERS = pro1,pro2,pro3,myuser1,myuser2
Cmnd_Alias CMDS = !/usr/bin/passwd,/usr/bin/passwd [A-Za-z],!/usr/bin/passwd root
-- sudo 搭配su
User_Alias ADMINS = pro1,pro2,pro3,myuser1,myuser2
ADMINS ALL=(root) /bin/su -
有效群组 与 初始群组
初始群组
用户已登录就拥有初始群组的权限,初始群组GID记录在/etc/passwd,/etc/group第四栏不需要记录初始群组的username
user如果有非初始群组,其username就需要记录在/etc/group的第四栏
有效群组
通过命令groups查看自己加入的所有群组,其中列出群组中的第一个即为有效群组
新建档案时,该档案的群组为有效群组
账号管理
新增用户
通过useradd命令新增用户
useradd的参考档案
- 通过useradd -D 列出useradd的默认值
- 通过useradd -D 其实是列出档案 /etc/default/useradd的内容,可以在该档案中进行修改
GID=100 新增账号的初始群组为GID100 (私有群组机制和公共群组机制)
-- 一般初始群组是与用户名同名的群组,即私有群组机制
HOME=/home 新增账号家目录的基准目录
INVALID=-1 密码过期后是否会失效的设定
-- 0表示密码过期后立刻失效
-- -1表示密码永远不会失效
-- 30表示密码过期30天后失效
EXPIRE= 账号失效的日期
SHELL=/bin/bash 默认使用的shell
-- 使用/sbin/nologin表示无登录shell,即无法登录
SKEL=/etc/skel 为家目录内容数据参考目录
CREATE_MAIL_SPOOL=yes 是否创建使用者的mailbox
- UID/GID/密码参数等参考档案/etc/login.defs
MAIL_DIR /var/spool/mail 用户默认邮件信箱放置目录
PASS_MAX_DAYS 99999 多久需要更改密码的天数
PASS_MIN_DAYS 0 多久不能更改密码天数
PASS_MIN_LEN 5 密码最短长度,已经被pam模块取代,失去作用
PASS_WARN_AGE 7 密码过期前提前多少天警告
UID_MIN 500 使用者最小的UID
UID_MAX 60000 使用者最大的UID
GID_MIN 500 使用者自定义组GID的最小值
GID_MAX 60000 使用者自定义组GID的最大值
CREATE_HOME yes 是否创建家目录,不加-m和-M时的默认值
UMASK 077 用户家目录建立的umask
USER_GROUPS_ENAB yes 使用userdel时,是否会删除初始群组
ENCRYPT_METHOD SHA512 密码加密算法
- useradd要参考的文档
/etc/default/useradd
/etc/login.defs
/etc/skel/*
用户删除
通过命令userdel删除用户
- 删除用户账号密码相关参数 /etc/passwd /etc/shadow
- 删除使用者群组相关参数 /etc/group /etc/gshadow
- 用户个人档案数据 /home/uername /var/spool/mail/username
如果只是暂时不启用某用户,可以将/etc/passwd的第八个字段账号失效日期设置为0
确认删除某个用户之前,最好先删除相关档案 find / -user username
用户特殊的shell 和 PAM模块
/sbin/nologin
/sbin/nologin 是不可登录shell,可以添加/etc/nologin.txt告知用户不可登录的原因。
PAM模块
PAM 通过一个与程序名称相同的配置文件进行验证分析需求。
---- 以passwd程序为例 ----
用户执行/usr/bin/passwd程序,并输入密码
passwd呼叫PAM模块进行验证
PAM到/etc/pam.d/下搜寻与程序同名(passwd)的配置文件
依据/etc/pam.d/passwd内的设定,引用相关PAM模块进行验证
将验证结果回传给passwd程序
passwd根据PAM回传结果做下一步动作---- PAM配置文件 ----
#%PAM-1.0 //PAM版本说明
auth include system-auth //每一行都是一个验证过程
account include system-auth
password include system-auth
//上面每一行都是呼叫/etc/pam.d/system-auth档案进行验证
-- 第一个字段 (验证类型)
---- auth (authentication的缩写,检验使用者的身份验证)
---- account (authorization授权,检验使用者是否有正确的权限)
---- password (修改变更密码)
---- session (管理使用者使用PAM期间的环境设定)
------ 验证类型一般是有顺序的
-- 第二个字段 (验证的控制标识)
---- required (成功返回success,失败返回failure,总会继续验证流程)
---- requisite (失败立刻返回failure,并终止验证,成功则带有success,并继续验证)
---- sufficient (成功立刻返回success,并终止验证,失败则带有failure,并继续验证)
---- optional (这个模块空间大多用于显示信息)
-- 第三个字段 (PAM模块)
---- pam_securetty.so (限制系统管理员只能从安全的终端机登录)
------ 如root能从tty1-tty7登录,不能通过telnet登入linux主机
---- pam_nologin.so (限制一般用户是否能够登入主机)
------ 该模块存在时,一般使用者无法登入系统
---- pam_selinux.so
---- pam_console.so (让使用者可以通过特许终端接口登入系统)
---- pam_loginuid.so (验证使用者的UID在规范的范围内)
---- pam_env.so (用于设定环境变量的一个模块)
---- pam_unix.so
---- pam_cracklib.so (用于验证密码的强度)
---- pam_limits.so (ulimit命令是通过该模块提供功能的,可参考/etc/security/limits.conf)
/etc/security/limits.conf文件
user1 soft fsize 90000
user2 hard fsize 100000
@group1 hard maxlogins 1
账号 限制依据 限制项目 限制值
账号若为群组可以加上@,如@group1
限制依据 严格为hard 警告为soft
文件设定完成就生效
/var/log/security 和 /var/log/messages
PAM产生的信息如错误信息等,会记录在/var/log/security中
相关目录
/etc/pan.d/* 每个程序个别的PAM配置文件
/lib/security/* PAM模块档案的实际放置目录
/etc/security/* 其他PAM环境配置文件
**/usr/share/doc/pam-*/ ** 详细的PAM说明文档
pam_cracklib.so验证字符串是否在字典中
散乱知识
登录Linux系统时,是通过UID和GID进行识别的,而不是通过账号名
ID和账号的对应关系记录与/etc/passwd和/etc/group中
整个登录的审核过程 /etc/passwd中寻找账号 -> 找到账号对应UID和GID -> 同时读出家目录和shell设定 -> 在/etc/shadow内找到对应的面进行审核 -> 进入shell
PAM密码管理机制位于/etc/pam.d/passwd
账号管理例子
---- 例子1
groupadd mygroup1
useradd -G mygroup1 -c "1st user" myuser1
useradd -G mygroup1 -c "2nd user" myuser2
useradd -c "3rd user" -s "/sbin/nologin" myuser3
echo "passwd" | passwd --stdin myuser1
echo "passwd" | passwd --stdin myuser2
echo "passwd" | passwd --stdin myuser3---- 例子2
groupadd projetca
useradd -G projecta -c "projecta user" pro1
useradd -G projecta -c "projecta user" pro2
useradd -G projecta -c "projecta user" pro3
echo "passwd" | passwd --stdin pro1
echo "passwd" | passwd --stdin pro2
echo "passwd" | passwd --stdin pro3
mkdir /srv/projecta
chgrp projecta /srv/projecta
chmod 2770 /srv/projecta
主机细部权限控制 ACL (Access Control List)
ACL可以针对 使用者 群组 和默认权限 进行设定
查看是否开启acl
mount 查看某个文件系统位于哪个分区
dumpe2fs -h 分区装置档案 通过Default mount options进行查看
加入acl功能
mount -o remount,acl /
mount
---- 若需要每次开机都起作用
vim /etc/fstab
LABEL=/1 / ext3 defaults,acl 1 1
---- 即可
转换成root身份
- su 以root身份登录(需要root密码)
- sudo 执行root的指令串
手动修改账号的相关配置文件
配置文件检查
- pwck 检查/etc/passwd和/etc/shadow文件是否书写正确
- grpck 检查/etc/group和/etc/gshadow等和群组有关的配置文件是否书写正确
- pwconv 将/etc/passwd中的密码移动到/etc/shadow中
- pwunconv 将/etc/shadow中的密码写回/etc/passwd
- chpasswd 读入未加密的密码,经过加密后,写入/etc/shadow中
格式为 "username:password",如 echo "username:passwd" | chpasswd -m
有passswd命令一般不使用该命令
手动建立账号步骤
- vi /etc/group 先建立群组
groupname❌520:
- grpconv 将/etc/group和/etc/gshadow同步
grpconv
- vi /etc/passwd 建立账号的各个属性
username❌700:520::/home/username:/bin/bash
- pwconv 将/etc/passwd和/etc/shadow同步
pwconv
- passwd username 建立账号的密码
passwd username
- cp -a /etc/skel /home/username 建立用户家目录
cp -a /etc/skel /home/username
- chown -R username:groupname /home/username 更改用户家目录属性
chown -R username:groupname /home/username
chmod 700 /home/username
大量新增账号模板
文件名 account1.sh
#!/bin/bash
# 该程序用于新增账号,功能为
# 1. 检查account1.txt是否存在,并将该档案内的账号取出
# 2. 建立上述档案的账号
# 3. 将上述账号的密码设置成 [强制第一次进入需要修改密码]
export PATH=/bin:/sbin:/usr/bin:/usr/sbin
# 检查 account1.txt是否存在
if [ ! -f account.txt ];then
echo "所需要的账号档案不存在,请建立account1.txt,每行一个账号名称"
exit 1
if
usernames=$(cat account1.txt)
for username in $usernames
do
useradd $username
echo $username | passwd --stdin $username
chage -d 0 $username
done
设定acl参数
通过getfacl查看acl设定,通过setfacl设定acl
命令
- passwd (修改密码)
passwd [--stdin] 通过管线获取密码
passwd -l 意思为Lock,会在/etc/shadow第二栏加上!,使密码失效
passwd -u 意思为unlock
passwd -s 列出密码相关的参数
passwd -n 多久不能修改密码天数
passwd -x 多久内要修改密码
passwd -w 密码过期前的警告天数
passwd -i 密码失效日期
passwd username 修改username的密码 (默认修改自己的密码)
- groups (查看自己加入的所有群组)
- newgrp (切换有效群组)
newgrp groupname 其中groupname必须是支持的群组
-- newgrp会进入一个新的shell环境,如要回到原来的shell环境,需要exit,同时有效群组会恢复
- useradd (新增用户)
useradd [-u UID] [-g 初始群组] [-G 次要群组] [-mM] [-c 说明栏] [-d 家目录绝对路径] [-s shell] 使用者账号名
useradd -M 强制,不要建立家目录(系统账号默认值)
useradd -m 强制,需要建立家目录(一般账号默认值)
useradd -r 建立一个系统账号,系统账号的UID有限制 (参考/etc/login.defs)
useradd -s 默认shell为/bin/bash
useradd -f 指定密码是否失效 0为立刻失效,-1为永远不失效
useradd -D 列出useradd的默认值
-- 默认会建立家目录,权限值为700,并建立一个与账号一模一样的群组名
-- useradd 默认会帮我们完成
---- 在/etc/passwd中建立一行与账号有关的数据,包括建立UID/GID/家目录等
---- 在/etc/shadow中将此账号的密码相关参数填入,但是尚未有密码
---- 在/etc/group中建立一个与账号名称一模一样的群组
---- 在/home底下建立一个与账号同名的用户家目录,且权限为700
-- 例子
useradd -u 700 -g users username
useradd -r username 建立一个系统账号,默认不会有家目录
- chage (修改密码参数)
chage [-ldEImMW] 账号名
chage -l 列出账号的详细密码参数
chage -d 修改最近一次修改密码日期,格式为YYYY-MM-DD
chage -E 修改账号失效日期,格式为YYYY-MM-DD
chage -I 修改密码失效日期,天数
chage -m 修改密码最短保留天数
chage -M 修改密码多久需要变更
chage -W 修改密码过期前警告天数
例子
chage -d 0 username 新建的username第一次登入必须修改密码
- usermod (修改账号相关参数)
usermod [-cdefgGlsuLU] username
usermod -c 后接账号说明
usermod -d 后接账号家目录
usermod -e 后接账号失效日期,格式YYYY-MM-DD
usermod -f 后接天数,密码过期后的宽限时间
usermod -g 后接初始群组
usermod -G 后接次要群组
usermod -a 与G合用,增加次要群组的支持
usermod -l 修改账号名称
usermod -s 修改默认shell
usermod -u 修改UID
usermod -L 暂时将用户密码冻结
usermod -U 解除冻结
例子
chown -R username:groupname /home/username 连同目录底下的用户群组一起变更
- userdel (删除用户)
userdel [-r] username
userdel -r 连同用户的家目录一起删除
- finger (查看用户信息,一般用户可使用)
finger [-s] username
finger -s 仅列出用户的账号,全名,终端机代号与登入的时间等等
finger 列出目前登入用户的信息
-- 列出基本都是/etc/passwd的内容
---- login -> 使用者账号
---- Name -> 全名,批注
---- Directory -> 家目录
---- Shell -> 所使用shell
---- Never logged in -> 账号登入主机的情况
---- No mail -> 调查/var/spool/mail中的资料
---- No plan -> 调查~username/.plan档案
- chfn (修改用户数据,finger数据,一般用户可使用)
chfn [-foph] 账号名
chfn -f 后接大名
chfn -o 办公室房间号码
chfn -p 办公室电话号码
chfn -h 家里电话号码
- chsh (修改默认shell,一般用户可使用)
chsh [-ls]
chsh -l 列出所有的可用shell (实际上是/etc/shells的内容)
chsh -s 设定修改自己的shell
-- 例子
chsh -s /bin/csh (修改成/bin/csh)
- id (查询某人或自己的UID/GID等)
id username 查询某人
uid gid groups context
context=为SELinux的内容
- groupadd (新增群组)
groupadd [-g gid] [-r] 组名
groupadd -g gid 指定GID
groupadd -r 建立系统群组
- groupmod (修改群组相关参数)
groupmod [-g gid] [-n groupname] 群组名
groupmod -g gid 修改GID
groupmod -n groupname 修改组名
- groupdel (删除群组)
groupdel groupname
删除群组时,必须没有用户使用该群组为起始群组
某则必须 1. 修改该用户的GID 2. 删除该用户
- gpasswd (群组管理功能)
-- root的动作
gpasswd groupname 给予groupname一个密码
gpasswd [-A user1,..] [-M user3,..] groupname
gpasswd -A user1,.. 将群组的主控权交由后面的使用者管理
gpasswd -M user3,.. 将某些账号加入这个群组中
gpasswd -r 移除groupname的密码
gpasswd -R 让groupname的密码失效
-- 群组管理员的动作
gpasswd [-ad] user groupname
gpasswd -a 将user加入到groupname群组中
gpasswd -d 将user移出groupname群组
acl
- getfacl (查看档案的acl设定)
- setfacl (设定档案的acl)
setfacl [-bkRd] [{-m|-x} acl参数] 目标文件名
setfacl -m 设定后续的acl参数给档案使用,不可与-x一起用
setfacl -x 删除后续的acl参数
setfacl -b 移除所有的acl参数设定
setfacl -k 移除预设的acl参数设定
setfacl -R 递归设定acl
setfacl -d 设定预设的acl参数,只对目录有效,在该目录新建的档案会引用此默认值
-- 针对特定用户
setfacl -m u:账号列表:rwx filename
-- 针对特定群组
setfacl -m g:群组列表:rwx filename
-- 针对有效权限mask的设定 通过mask规范最大允许权限
setfacl -m m:rwx filename
-- 针对预设权限的设定
setfacl -m d:ug:rwx
用户
- su (切换用户)
su [-lm] [-c 指令] username
su - 或 su -l 使用login-shell的方式切换用户
su -m 使用目前的环境设定,不读取新的配置文件
su -c 仅执行一次指令,执行完毕后退出
单纯地使用su是切换到root用户,以non-login-shell方式
- sudo (以其他用户身份执行)
可执行sudu命令的用户需要在/etc/sudoers中进行规范
sudo [-b] [-u 新使用者账号]
sudo -b 将命令放到后台系统自动执行,不与目前shell产生影响
sudo -u user 切换到user的身份执行命令,无则为root
- visudo (修改/etc/sudoers档案)
- w (查看目前已登入系统用户的信息)
用户名 登入终端 IP接入口 登入时间等
- who (查看目前已登入系统用户的信息)
用户名 登入 登入时间和IP
- lastlog (查看每个账号最近的登入时间)
- write 对用户发送信息
write 使用者账号 [用户所在的终端接口]
- mesg (设置是否接收信息)
mesg [y|n]
mesg 可以查看别人发送的信息
- wall (对线上所有人发送广播)
wall "STR"
- mail (发送邮件)
mail username@localhost -s "邮件标题"
最后输入小数点.并
可以利用数据流重导向 <
mail username -s "title" < file
mail 查看信箱
其他
. sh (执行脚本)
sh -c 执行字符串对应的脚本
参考
鸟哥Linux私房菜 第三版