用户和用户组管理
linux是一个多用户,多任务操作系统,每个使用者都有自己的用户标识、密码,需要经过认证授权才能正常使用:
Authentication
Authorization
Audition
1.用户
用户类别
管理员用户
普通用户:
系统用户:对守护进程获取资源进行权限分配,不能登录系统
登录用户:能交互式登录系统
用户标识
userID :UID
管理员用户ID:0
普通用户ID:1-65535
系统用户:1-499(centos6),1-999(centos7)
登录用户:500-60000(centos6),1000-60000(centos7)
系统根据名称解析库/etc/passwd文件将用户名和UID转换
2.组
定义
用户容器
组类别1
管理员组
普通用户组:
系统用户组
登录用户组
组标识
groupID:GID
管理员组ID:0
普通用户组ID:1-65535
系统用户组:1-499(centos6),1-999(centos7)
登录用户组:500-60000(centos6),1000-60000(centos7)
系统根据名称解析库/etc/group文件将用户名和UID转换
组类别2
基本组
附加组
组类别3
私有组:组名和用户名相同,并且只有唯一用户
公共组:包含多个用户
认证
将用户登录时提供的信息与此前事先存储到系统的信息对比,确认信息是否一致:
password:
用户/etc/passwd
组/etc/gpasswd
/etc/passwd文件:用户信息库
内容字段如下:
用户名:密码或占位符x:用户ID:所属组ID:注释信息:用户家目录:默认shell
/etc/shadow文件:用户密码
内容字段如下:
用户名:加密的密码:最近一次修改密码的时间:最短使用期限:最长使用期限:警告期段:过期期限:保留字段
/etc/group文件:组信息库
内容字段如下:
组名:密码:组ID:用户列表
相关用户和组管理命令
useradd,userdel,usermod,passwd,groupadd,groupdel,groupmod,gpasswd,chage,chsh,id,su
1.用户管理命令
1.useradd:创建用户
useradd [选项] 登录名
-u, --uid UID:指定UID;
-g, --gid GROUP:指定基本组ID,此组得事先存在;
-G, --groups GROUP1[,GROUP2,...[,GROUPN]]]:指明用户所属的附加组,多个组之间用逗号分隔;
-c, --comment COMMENT:指明注释信息;
-d, --home HOME_DIR:以指定的路径为用户的家目录;通过复制/etc/skel此目录并重命名实现;指定的家目录路径如果事先存在,则不会为用户复制环境配置文件;
-s, --shell SHELL:指定用户的默认shell,可用的所有shell列表存储在/etc/shells文件中;
-r, --system:创建系统用户;
注意:创建用户时的诸多默认设定配置文件为/etc/login.defs
useradd -D:显示创建用户的默认配置;
[root@docker ~]# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
useradd -D 选项: 修改默认选项的值;
修改的结果保存于/etc/default/useradd文件中;
2.usermod命令:修改用户属性
usermod [选项] 登录
-u, --uid UID:修改用户的ID为此处指定的新UID;
-g, --gid GROUP:修改用户所属的基本组;
-G, --groups GROUP1[,GROUP2,...[,GROUPN]]]:修改用户所属的附加组;原来的附加组会被覆盖;
-a, --append:与-G一同使用,用于为用户追加新的附加组;
-c, --comment COMMENT:修改注释信息;
-d, --home HOME_DIR:修改用户的家目录;用户原有的文件不会被转移至新位置;
-m, --move-home:只能与-d选项一同使用,用于将原来的家目录移动为新的家目录;
-l, --login NEW_LOGIN:修改用户名;
-s, --shell SHELL:修改用户的默认shell;
-L, --lock:锁定用户密码;即在用户原来的密码字符串之前添加一个"!";
-U, --unlock:解锁用户的密码;
3.userdel命令:删除用户
userdel [选项] 登录名
-r:删除用户时一并删除其家目录;
2.用户组管理命令
1.groupadd命令:添加组
groupadd [选项] group_name
-g GID:指定GID;默认是上一个组的GID+1;
-r: 创建系统组;
2.groupmod命令:修改组属性
groupmod [选项] GROUP
-g GID:修改GID;
-n new_name:修改组名;
3.groupdel命令:删除组
groupdel [选项] GROUP
3.密码管理命令
passwd命令:
passwd [-k] [-l] [-u [-f]] [-d] [-e] [-n mindays] [-x maxdays] [-w warndays] [-i inactivedays] [-S] [--stdin] [username]
(1) passwd:修改用户自己的密码;
(2) passwd USERNAME:修改指定用户的密码,但仅root有此权限;
-l, -u:锁定和解锁用户;
-d:清除用户密码串;
-e DATE: 过期期限,日期;
-i DAYS:非活动期限;
-n DAYS:密码的最短使用期限;
-x DAYS:密码的最长使用期限;
-w DAYS:警告期限;
--stdin:
echo "PASSWORD" | passwd --stdin USERNAME
gpasswd命令:
组密码文件:/etc/gshadow
gpasswd [选项] group
-a USERNAME:向组中添加用户
-d USERNAME:从组中移除用户
4.其它命令
newgrp命令:临时切换指定的组为基本组;
newgrp [-] [group]
-: 会模拟用户重新登录以实现重新初始化其工作环境;
chage命令:更改用户密码过期信息
chage [选项] 登录名
-d, --lastday LAST_DAY 将上次更改密码的日期设置为LAST_DAY
-E, --expiredate EXPIRE_DATE 将帐户过期日期设置为EXPIRE_DATE
-I, --inactive INACTIVE 将过期后的密码设置为非活动密码
-l, --list 显示密码策略
-m, --mindays MIN_DAYS 将密码更改前的最小天数设置为MIN_DAYS
-M, --maxdays MAX_DAYS 将密码更改前的最大天数设置为MAX_DAYS
-W, --warndays WARN_DAYS 将过期警告日期设置为WARN_DAYS
id命令:显示用户的真和有效ID;
id [OPTION]... [USER]
-u: 仅显示有效的UID;
-g: 仅显示用户的基本组ID;
-G:仅显示用户所属的所有组的ID;
-n: 显示名字而非ID;
su命令:切换用户
登录式切换:会通过读取目标用户的配置文件来重新初始化
su - USERNAME
su -l USERNAME
非登录式切换:不会读取目标用户的配置文件进行初始化
su USERNAME
注意:管理员可无密码切换至其它任何用户;
-c 'COMMAND':仅以指定用户的身份运行此处指定的命令;
密码使用策略
1.密码尽量随机
2.长度不要少于8位
3.应使用大写字母、小写字母、数字、标点符号等字符中至少三种
4.定期修改密码
权限管理
1.常用权限
[root@docker ~]# ls -l test.txt
-rwxrwxrwx. 1 root root 485 Jul 27 02:40 test.txt
rwxrwxrwx:
左三位:定义user(owner)的权限
中三位:定义group的权限;
右三位:定义other的权限
进程安全上下文:
进程对文件的访问权限应用模型:
进程的属主与文件的属主是否相同;如果相同,则应用属主权限;
否则,则检查进程的属主是否属于文件的属组;如果是,则应用属组权限;
否则,就只能应用other的权限;
权限:
r:readable, 读
w:writable, 写
x:excutable,执行
文件:
r:可获取文件的数据;
w: 可修改文件的数据;
x:可将此文件运行为进程;
目录:
r:可使用ls命令获取其下的所有文件列表;
w: 可修改此目录下的文件列表;即创建或删除文件;
x: 可cd至此目录中,且可使用ls -l来获取所有文件的详细属性信息;
权限组合机制:
--- 000 0
--x 001 1
-w- 010 2
-wx 011 3
r-- 100 4
r-x 101 5
rw- 110 6
rwx 111 7
权限管理命令:
chmod命令:
chmod [OPTION]... MODE[,MODE]... FILE...
chmod [OPTION]... OCTAL-MODE FILE...
chmod [OPTION]... --reference=RFILE FILE...
三类用户:
u:属主
g:属组
o:其它
a: 所有
(1) chmod [OPTION]... MODE[,MODE]... FILE...
MODE表示法:
赋权表示法:直接操作一类用户的所有权限位rwx;
u=
g=
o=
a=
授权表示法:直接操作一类用户的一个权限位r,w,x;
u+, u-
g+, g-
o+, o-
a+, a-
(2) chmod [OPTION]... OCTAL-MODE FILE...
(3) chmod [OPTION]... --reference=RFILE FILE...
选项:
-R, --recursive:递归修改
注意:用户仅能修改属主为自己的那些文件的权限;
从属关系管理命令:chown, chgrp
chown命令:
chown [OPTION]... [OWNER][:[GROUP]] FILE...
chown [OPTION]... --reference=RFILE FILE...
选项:
-R:递归修改
chgrp命令:
chgrp [OPTION]... GROUP FILE...
chgrp [OPTION]... --reference=RFILE FILE...
注意:仅管理员可修改文件的属主和属组;
umask:文件的权限反向掩码,遮罩码;
文件:
666-umask
目录:
777-umask
注意:之所以文件用666去减,表示文件默认不能拥有执行权限;如果减得的结果中有执行权限,则需要将其加1;
umask: 023
666-023=644
777-023=754
umask命令:
umask:查看当前umask
umask MASK: 设置umask
注意:此类设定仅对当前shell进程有效;
2.特殊权限
SUID, SGID, Sticky
进程安全上下文:
进程对文件的访问权限应用模型:
进程能否执行取决于进程的发起者对进程文件是否拥有执行权限;
进程的属主与文件的属主是否相同;如果相同,则应用属主权限;
否则,则检查进程的属主是否属于文件的属组;如果是,则应用属组权限;
否则,就只能应用other的权限;
SUID
可执行文件上加上SUID特殊权限,可使进程以可执行程序文件的属主身份运行,若文件所有者有权限执行,即加了SUID权限的可执行程序文件任何用户都可以执行,只对可执行程序有效
权限设定:
chmod u+s FILE...
chmod u-s FILE...
SGID
可执行文件上加上SGID特殊权限,可使进程以可执行程序文件的属组身份运行,若文件所属组有权限执行,即加了SGID权限的可执行程序文件任何用户都可以执行
权限设定:
chmod g+s FILE...
chmod g-s FILE...
在目录上添加SGID特殊权限
默认情况,用户创建新文件,该文件的属组为用户的主组,
在目录上设置SGID权限可使在此目录下创建的文件所有组为该目录的所有组;
常用于拥有不同主组相同附加组的用户之间协作
权限设定:
chmod g+s DIR...
chmod g-s DIR...
Sticky
用户对目录拥有写权限就可以删除目录中的任何文件,在目录上设置Sticky权限,该目录下的文件只有文件所有者和管理员用户才能删除;
与目录上的SGID一同使用,常用于用户之间协作,实现不同用户创建的文件可以互相修改而不能删除其它用户创建的文件
权限位映射
[root@docker ~]# ls -l test.txt
-rwSrwsrwT. 1 root root 485 Jul 27 02:40 test.txt
添加特殊权限位会占用普通权限的执行权限位置,
SUID: user,占据属主的执行权限位
s:属主拥有x权限
S:属主没有x权限
SGID: group,占据属组的执行权限位
s:group拥有x权限
S:group没有x权限
Sticky: other,占据other的执行权限位
t:other拥有x权限
T:other没有x权限
文件特定属性
使用
chattr [选项]
-R:递归处理,将指令目录下的所有文件及子目录一并处理;
-v<版本编号>:设置文件或目录版本;
-V:显示指令执行过程;
+<属性>:开启文件或目录的该项属性;
-<属性>:关闭文件或目录的该项属性;
=<属性>:指定文件或目录的该项属性。
chattr +i file 不能任意更改文件
chattr +a file 只能追加文件
lsattr file 查看文件特殊属性
3.facl:文件访问控制列表
setfacl 设定文件访问控制
setfacl 2.2.51 -- set file access control lists
Usage: setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
-m, --modify=acl modify the current ACL(s) of file(s)
-M, --modify-file=file read ACL entries to modify from file
-x, --remove=acl remove entries from the ACL(s) of file(s)
-X, --remove-file=file read ACL entries to remove from file
-b, --remove-all remove all extended ACL entries
-k, --remove-default remove the default ACL
--set=acl set the ACL of file(s), replacing the current ACL
--set-file=file read ACL entries to set from file
--mask do recalculate the effective rights mask
-n, --no-mask don't recalculate the effective rights mask
-d, --default operations apply to the default ACL
-R, --recursive recurse into subdirectories
-L, --logical logical walk, follow symbolic links
-P, --physical physical walk, do not follow symbolic links
--restore=file restore ACLs (inverse of `getfacl -R')
--test test mode (ACLs are not modified)
-v, --version print version and exit
-h, --help this help text
facl权限生效顺序:
所有者,自定义用户,所有组,自定义组,其他人
示例
1.设置acl
setfacl -m u:testuser:rwx testfile
setfacl -m g:testgroup:rw testfile
setfacl -m o:--- testfile
[root@docker testdir]# getfacl testfile
# file: testfile
# owner: root
# group: root
user::rw-
user:testuser:rwx
group::r--
group:testgroup:rw-
mask::rwx
other::---
2.删除acl
setfacl -x u:testuser testfile
setfacl -x g:testgroup testfile
3.删除文件上所有acl
setfacl -b testfile
4.设置默认acl
对目录设置默认acl后,在目录中新建的文件会继承目录的acl权限
setfacl -d -m u:testuser:rwx testdir
[root@docker /]# getfacl testdir/
# file: testdir/
# owner: root
# group: root
user::-wx
group::r-x
other::r-x
default:user::-wx
default:user:testuser:rwx
default:group::r-x
default:mask::rwx
default:other::r-x
[root@docker /]# touch testdir/file.test
[root@docker /]# getfacl testdir/file.test
# file: testdir/file.test
# owner: root
# group: root
user::-w-
user:testuser:rwx #effective:rw-
group::r-x #effective:r--
mask::rw-
other::r--
5.移除默认acl
setfacl -k testdir
6.备份文件acl
getfacl testfile > testfile.acl
getfacl -R testdir > testdir.acl
7.恢复备份的acl
setfacl -R --set-file=testdir.acl testdir
setfacl --restore testdir.acl
8.acl_mask
文件acl_mask规定的是acl_user,group,acl_group三者的最大权限
文件testfile正常权限为664
[root@docker testdir]# ll testfile
-rw-rw-r--. 1 root root 0 Jul 29 08:09 testfile
设定acl之后显示其mask为rw-
[root@docker testdir]# setfacl -m u:testuser:r,g:testgroup:rw testfile
[root@docker testdir]# getfacl testfile
# file: testfile
# owner: root
# group: root
user::rw-
user:testuser:r--
group::rw-
group:testgroup:rw-
mask::rw-
other::r--
再次设定文件acl,mask变成rwx
[root@docker testdir]# setfacl -m g:testgroup:x testfile
[root@docker testdir]# getfacl testfile
# file: testfile
# owner: root
# group: root
user::rw-
user:testuser:r--
group::rw-
group:testgroup:--x
mask::rwx
other::r--
然而此时文件testfile所有组权限由rw-变成rwx了,但是文件所属组中用户要执行testfile任然没有权限,原因在于文件所有组权限只有读和写,没有执行权限,此处显示的是acl_mask的值,需要getfacl确认权限
[root@docker testdir]# ll testfile
-rw-rwxr--+ 1 root root 0 Jul 29 08:09 testfile
当我们设定对文件设定mask时,可以看到acl_user,acl_group,group生效权限都变成了r--,
[root@docker testdir]# setfacl -m u:testuser:rw testfile
[root@docker testdir]# setfacl -m mask::r testfile
[root@docker testdir]# getfacl testfile
# file: testfile
# owner: root
# group: root
user::rw-
user:testuser:rw- #effective:r--
group::rw- #effective:r--
group:testgroup:--x #effective:---
mask::r--
other::r--
此时文件testfile所有组权限显示也变为了r--
[root@docker testdir]# ll testfile
-rw-r--r--+ 1 root root 0 Jul 29 08:09 testfile