linux备忘录-账号管理与ACL权限设定

知识

账号管理中的一些文件结构

/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的参考档案

  1. 通过useradd -D 列出useradd的默认值
  2. 通过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

  1. 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 密码加密算法

  1. useradd要参考的文档

/etc/default/useradd

/etc/login.defs

/etc/skel/*

用户删除

通过命令userdel删除用户

  1. 删除用户账号密码相关参数 /etc/passwd /etc/shadow
  2. 删除使用者群组相关参数 /etc/group /etc/gshadow
  3. 用户个人档案数据 /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系统时,是通过UIDGID进行识别的,而不是通过账号名

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身份

  1. su 以root身份登录(需要root密码)
  2. sudo 执行root的指令串

手动修改账号的相关配置文件

配置文件检查

  1. pwck 检查/etc/passwd和/etc/shadow文件是否书写正确
  2. grpck 检查/etc/group和/etc/gshadow等和群组有关的配置文件是否书写正确
  3. pwconv 将/etc/passwd中的密码移动到/etc/shadow中
  4. pwunconv 将/etc/shadow中的密码写回/etc/passwd
  5. chpasswd 读入未加密的密码,经过加密后,写入/etc/shadow中

格式为 "username:password",如 echo "username:passwd" | chpasswd -m

有passswd命令一般不使用该命令

手动建立账号步骤

  1. vi /etc/group 先建立群组

groupname❌520:

  1. grpconv 将/etc/group和/etc/gshadow同步

grpconv

  1. vi /etc/passwd 建立账号的各个属性

username❌700:520::/home/username:/bin/bash

  1. pwconv 将/etc/passwd和/etc/shadow同步

pwconv

  1. passwd username 建立账号的密码

passwd username

  1. cp -a /etc/skel /home/username 建立用户家目录

cp -a /etc/skel /home/username

  1. 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

命令

  1. passwd (修改密码)

passwd [--stdin] 通过管线获取密码

passwd -l 意思为Lock,会在/etc/shadow第二栏加上!,使密码失效

passwd -u 意思为unlock

passwd -s 列出密码相关的参数

passwd -n 多久不能修改密码天数

passwd -x 多久内要修改密码

passwd -w 密码过期前的警告天数

passwd -i 密码失效日期

passwd username 修改username的密码 (默认修改自己的密码)

  1. groups (查看自己加入的所有群组)
  2. newgrp (切换有效群组)

newgrp groupname 其中groupname必须是支持的群组

-- newgrp会进入一个新的shell环境,如要回到原来的shell环境,需要exit,同时有效群组会恢复

  1. 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 建立一个系统账号,默认不会有家目录

  1. 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第一次登入必须修改密码

  1. 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 连同目录底下的用户群组一起变更

  1. userdel (删除用户)

userdel [-r] username

userdel -r 连同用户的家目录一起删除

  1. 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档案

  1. chfn (修改用户数据,finger数据,一般用户可使用)

chfn [-foph] 账号名

chfn -f 后接大名

chfn -o 办公室房间号码

chfn -p 办公室电话号码

chfn -h 家里电话号码

  1. chsh (修改默认shell,一般用户可使用)

chsh [-ls]

chsh -l 列出所有的可用shell (实际上是/etc/shells的内容)

chsh -s 设定修改自己的shell

-- 例子

chsh -s /bin/csh (修改成/bin/csh)

  1. id (查询某人或自己的UID/GID等)

id username 查询某人

uid gid groups context

context=为SELinux的内容

  1. groupadd (新增群组)

groupadd [-g gid] [-r] 组名

groupadd -g gid 指定GID

groupadd -r 建立系统群组

  1. groupmod (修改群组相关参数)

groupmod [-g gid] [-n groupname] 群组名

groupmod -g gid 修改GID

groupmod -n groupname 修改组名

  1. groupdel (删除群组)

groupdel groupname

删除群组时,必须没有用户使用该群组为起始群组

某则必须 1. 修改该用户的GID 2. 删除该用户

  1. 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

  1. getfacl (查看档案的acl设定)
  2. 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

用户

  1. su (切换用户)

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

su - 或 su -l 使用login-shell的方式切换用户

su -m 使用目前的环境设定,不读取新的配置文件

su -c 仅执行一次指令,执行完毕后退出

单纯地使用su是切换到root用户,以non-login-shell方式

  1. sudo (以其他用户身份执行)

可执行sudu命令的用户需要在/etc/sudoers中进行规范

sudo [-b] [-u 新使用者账号]

sudo -b 将命令放到后台系统自动执行,不与目前shell产生影响

sudo -u user 切换到user的身份执行命令,无则为root

  1. visudo (修改/etc/sudoers档案)
  2. w (查看目前已登入系统用户的信息)

用户名 登入终端 IP接入口 登入时间等

  1. who (查看目前已登入系统用户的信息)

用户名 登入 登入时间和IP

  1. lastlog (查看每个账号最近的登入时间)
  2. write 对用户发送信息

write 使用者账号 [用户所在的终端接口]

  1. mesg (设置是否接收信息)

mesg [y|n]

mesg 可以查看别人发送的信息

  1. wall (对线上所有人发送广播)

wall "STR"

  1. mail (发送邮件)

mail username@localhost -s "邮件标题"

最后输入小数点.并

可以利用数据流重导向 <

mail username -s "title" < file

mail 查看信箱

其他

. sh (执行脚本)

sh -c 执行字符串对应的脚本

参考

鸟哥Linux私房菜 第三版

上一篇:别人的Linux私房菜(14)Linux账号管理和ACL权限设置


下一篇:Linux 账号管理与 ACL 权限配置