用户、组、文件权限
linux系统登陆
登陆名是用户用来登陆系统的最长常8字符串,可以包含字母或数字,同时关联一个对应的密码
PAM
PAM即可插入式认证模块,其配置文件位于/etc/pam.d/*
/bin/login
系统启动后显示的登陆界面,是由/bin/login程序实现,/bin/login提供用户认证,其在编译时依赖于PAM
此程序默认到/etc/passwd和/etc/shadow文件中取匹配
login程序使用名称转换机制,调用nsswitch框架
备注:用户账号信息完全可用放到别的位置,比如nis数据库、LDAP数据和mysql数据库
nsswitch
nsswitch即网络服务转换/切换,是在login程序和passwd/shadow之间的一个中间层。实现处于不同用户认证数据库的账号信息耦合,
而不用再编译login程序。
nswitch是一个框架,它能配置到哪去找用户的账号密码信息(如:/etc/passwd,/etc/shadow),非常灵活、方便。
login程序借助nsswitch的功能,找到其框架定义的UID、密码和GID,完成用户认证
配置文件:/etc/nsswitch.conf,配置login程序基于哪个具体的库找对应存放用户账号密码的文件
库:libnss_file.so(passwd认证)、libnss_nis.so(nis)、libnss_ldap.so(ldap),用于实现不同的名称转换功能
用户管理
useradd、userdel、usermod、passwd、chsh、chfn、finger、id、chage
/etc/passwd文件
用于存储用户账号信息,普通用户只读
UID:用户ID
UID0:管理员账号
UID1~499:系统账号,为实现安全,为每个后台的服务单独创建一个系统账号,此账号不能登陆系统
UID 500~65535:普通账号
GID:用户组ID
GID0:管理员组
GID1~499:系统组
GID500~65535:普通组
/etc/passwd文件格式:每行用6个冒号,分割成7段
字段解释:
1.用户名:
2.用户密码:x是密码占位符,表示密码存储在其他文件中,即/etc/shadow(安全起见)
3.用户UID:
4.用户GID:
5.备注:用户账号的描述
6.用户HOME目录:
7.用户的默认shell
/etc/shadow文件
用于存放用户的密码信息,普通用户不可读
/etc/shadow文件格式:每行8个冒号,分割成9段
字段解释:
1.用户名:
2.加密后的密码:MD5方式加密
只有2个!!,表示未设置密码
密码前加2个!!,表示锁定密码(密码锁定后,不能登陆系统)
密码前加1个!,表示锁定账号(账号锁定后,不能登陆系统)
3.自1970-01-01到最近一次修改密码经过的天数
4.密码最短使用期限:多少天后才能更改密码,以上一次修改密码的时间为基准
5.密码最长使用期限:多少天后必须更改密码,以上一次修改密码的时间为基准
6.密码过期前多少天提醒用户更改密码:
7.密码过期后多少天禁用用户账户
8.用户账号被禁用的日期:自1970-01-01经过多少天后,禁用用户账号。
9.预留字段
加密方法
1.对称加密:加密和解密使用同一个秘钥
2.非对称加密:每个密码都成对出现,一个为公钥,一个为私钥。公钥隐含于私钥中,可以提取出来,并公开出去。
公钥加密,私钥解密:用于加密
私钥加密,公钥解密:用于签名
备注:非对称加密比对称加密慢3个数量级,相当耗资源
3.单向加密/散列加密:
不可逆
非定长输入,定出输出。
MD5: 128位定长输出(麻省理工学院人工智能实验室研发)
SHA1:160位定长输出(美国国家委员会召集出来的一种通用算法),即安全hash算法
SHA256:
SHA512:军用级别
添加新用户
1.查看创建用户时的系统默认值
#useradd -D
GROUP=100 #默认加入组100中
HOME=/home #默认主目录
INACTIVE=-1 #默认用户的密码在过期后不会被禁用
EXPIRE= #未设置用户禁用日期,即永不过期
SHELL=/bin/bash #默认shell
SKEL=/etc/skel #用户模板,创建用户时,会自动将/etc/skel中的文件,复制到用户加目录下
CREATE_MAIL_SPOOL=yes #/var/mail下为用户创建一个收件箱,用于接收邮件。
备注:/etc/skel中包含的都是环境配置文件,.bashrc .bash_profile .bash_logout
2.修改创建用户时的系统默认值
#useradd -D [args]
args:
-d 更改用户HOME目录位置
-f 更改用户的密码过期后多少天后禁用
-e 更改用户到期的日期,YYYY-MM-DD格式
-g 更改用户默认组
-s 更好默认的shell
eg: #useradd -D -s /bin/csh #修改用户默认shell为csh
备注:也可直接修改对应的配置文件/etc/default/useradd
3.创建用户
useradd
-d 指定HOME目录,默认认为/home/用户名
-e、-f、-g、-s、-d,用法与上面相同
-G 指定附加组
-p 指定用户密码
-u 设置账户UID,默认自动排序
-M 不创建用户的HOME目录
-n 创建一个和用户登陆名同名的新组(默认不加-g选项,系统会自动创建一个与登陆名同名的组,不用-n)
-c 给用户添加备注信息
-r 创建系统账户,无HOME目录,也不能登陆系统(sbin/nologin)
备注:没有HOME目录的用户登陆系统,直接在/目录下,提示符 bash-4.1$
修改用户
1.usermod
-l 修改用户登陆名, #usermod -l 新名 旧名
-L 锁定用户
-U 解锁用户
-p 修改账户的密码
-g 修改用户默认组 #usermod -g 组名 用户名
-G 修改更改用户附加组 #usermode -G 组名 用户名
-u 修改用户uid #usermode -u uid 用户名
-d 修改用户HOME目录
-s 修改用户默认shell
-e 修改用户过期时间
-f 修改密码过期后到禁用的时间
备注:-G选项,默认会覆盖之前的附加组配置。如果增加附加组的话,需要-a -G选项
2.passwd和chpasswd
passwd
-e 强制用户下此登陆修改密码
-l 锁定用户密码
-u 解锁用户密码
-d 删除用户密码
-S 查看用户是否设置密码
-n 指定密码最短使用期限
-x 指定密码最长使用权限
-w 密码告警期限:过期前多少天提醒更改密码
也可通过标准输入,修改密码:
#echo "01234567" | passwd --stdin szb #设置用户密码为01234567
chpasswd 批量修改密码
编写密码对文件,格式: 用户名:密码
#cat users.txt
test1:1q2w3e
test2:1q1q1q
#chpasswd < users.txt #按配置文件设置用户的密码
3.chsh 修改用户登陆shell (此次登陆生效)
#chsh -s /bin/csh [用户名] #不加用户名参数,默认修改当前用户的shell(普通用户只能修改自己的shell)
4.修改用户备注信息
#chfn szb
Changing finger information for szb.
Name []: crazy
Office []: hello
Office Phone []: 6852333
Home Phone []: 010-111222
#普通用户只能修改自己的备注信息
5.查看用户备注信息
#finger szb
6.管理用户账号的有效期
chage
-d 修改上次修改密码的时间(自1970-01-01 至上次修改密码时期的天数),单位:天数
-E 设置密码过期的日期,格式:YYYY-MM--DD,或自1970 01-01经过的天数。
-I 设置密码过期到锁定用户的天数
-m 设置密码最短使用期限
-M 设置密码最长使用期限
-W 密码过期前多久提示用户修改密码
7.删除用户
userdel
-r #连同HOME目录和”mail/用户名“2个目录
8.查看用户账号的完整性
#pwck
组管理
groupadd、groupdel、groupmod、gpasswd、groups
1.查看用户属性
id [option] USERNAME
-u 查看用户uid
-g 查看用户主要组(默认组)ID
-G 查看用户所有组ID,第一个是主要组,后面显示的都是附件组。
-n 与其他选项结合使用,将UID、GID转换为用户、组的名称
#id szb #不加选项,显示用户详细信息
uid=503(szb) gid=503(szb) groups=503(szb),504(g1),505(g2) context=root:system_r:unconfined_t:SystemLow-SystemHigh
第一个组显示的是szb用户的主要组(标红),后面的都是附加组(标蓝)
#id -G szb
503 504 505
#id -Gn szb
szb g1 g2
2.查看用户所属组
groups USERNAME
#group szb
szb: szb songzhibing ww #显示格式: 用户:主要组 附加组...
3、创建组
groupadd [option] GROUPNAME
-g 指定gid
-r 设置添加的组为系统组
4.修改组
groupmod [option] GROUPNAME
-g 修改gid
-n 修改组名,修改组名后,GID、组成员不变
5.删除组
groupdel GROUPNAME
6.修改组密码
gpasswd
-r 删除组密码
-R 锁定组密码
-d 组中删除用户
-a 组中增加用户
6.修改用户的主要组:临时生效
#newgrp GROUPNAME [用户名]
文件权限
理解文件权限
1.umask
root用户的默认umask=0022,普通用户的默认umask=0002
第1位用于特殊权限,不用与权限计算。
查看umask值:
#umask
2.创建文件、目录的默认权限
创建文件、目录的默认权限=文件、目录的最大权限-umask后3位
备注:linux权限默认不继承
文件最大权限:666
目录最大权限:777
3.权限
r,w,x
8进值 二进制 ls -l查看显示 备注
0 000 --- 无权限
1 001 --x 执行
2 010 -w- 写
3 011 -wx 写、执行
4 100 r-- 读
5 101 r-x 读、执行
6 110 rw- 读、写
7 111 rwx 读、写、执行
r:4
w:2
x:1
文件:
r:可读,可用cat等命令查看文件内容、复制
w:可写,可编辑或删除此文件
x:可执行,当作命令提交给内核运行
目录:
r:可读,可以用ls命令,列出目录内部所有文件
w:可写,可在此目录创建文件
x:可执行,可以cd切换进此目录,也可以用ls -l查看内部文件的详细信息。
更改文件权限
chmod
1.更改所有用户权限
chmod 742 filename # 修改filename的权限:属主权限(读、写、执行)、属组权限(读)、其他用户权限(写)
2.根据用户类别设置权限
chmod [ugo]<+-=> <rwxXstugo>
用户类别:可选,不写表示针对所有用户
u:属主
g:属组
o:其他用户
a:所有,等同于ugo
权限操作符:
+ :给用户类别增加权限
-: 给用户类别减少权限
=:给用户类别设置等于权限,等号出现时,必须指定用户类别选项(不能为空)
权限:
r:读
w:写
x:执行
u:根据权限操作符不同,让用户类别增加、删除、等于属主的权限
g:根据权限操作符不同,让用户类别增加、删除、等于属组的权限
o:根据权限操作符不同,让用户类别增加、删除、等于其他用户的权限
X:不懂
s:特殊权限
t:粘着位
eg:
#chmod +x filename #给所有用户增加执行权限
#chmod g=a filename #设置属组权限等于属主的权限
#chmod u-wx #用户减少写、执行权限
改变所属关系
1.改变文件属主
chown 所属主 filename...
-R 递归设置属主
--reference=somefile file1 file2 #将file1、file2的属主改成和somefile一致
eg: #chown -R hadoop /tmp/abc #递归设置abc目录及其内部文件、目录的属主为hadoop
tips:
chown可以同时修改文件的属主、属组,也可以单独修改文件属组
#chown root:root /tmp/abc #属主、属组一块改
#chown :root /tmp/abc #只修改属组
2.改变文件属组
chgrp 所属组 filename...
-R 递归修改
--reference=somefile file1 file2 #将file1、file2的属组改成和somefile一致、
修改文件特殊属性 chattr
chattr [RV] [-v version] [mode] files...
-R 递归修改
mode:+=[ASACDdIijsTtu]
a:只能追加内容,不能删除
i:不能追加、改名、删除
s:(安全)属性:当文件被删除时,此文件所在磁盘的块将全部被0填充
u:(不可删除)属性:文件删除后,此文件的内容还可以被恢复
c:(压缩)属性:当此文件在写操作时,将自动被压缩。读的时候,自动解压
#chattr +a filename #给filename增加a权限
--reference=somefile file1 file2 #将file1、file2的属组改成和somefile一致、
查看文件特殊属性 lsattr
lsattr [-RVadv] [files...] #不加文件参数,显示当前所有文件的特殊属性。
文件特殊权限
linux特殊权限:SUID、SGID、SBIT(粘着位)
SUID:针对文件,当文件被用户使用时,程序会以文件的属主的权限执行
SGID:针对文件和目录,对文件来说,程序会以文件的属组的权限执行,对于目录来说,目录中创建的新
文件会以目录的属组作为属组。
SBIT:进程结束后,文件还会在内存中
特殊权限设置:
chmod 4777 file #第一位表示特殊权限
chmod u+s file #文件属主增加SUID权限
chmod g+s file #文件属组增加GUID权限
chmod o+t file #其他用户增加粘着位权限
特殊权限表示格式说明
二进制值 八进制值 权限描述
000 0 无特殊权限
001 1 粘着位
010 2 SGID
011 3 SGID和粘着位
100 4 SUID
101 5 SUID和粘着位
110 6 SUID和SGIG
111 7 SUID、SGID、粘着位
第1位表示SUID,第2位表示SGID,第3位表示粘着位
SUID
1.使用前提:
只能对二进制程序有效
执行者对于程序需要有执行权限
2.SUID权限效果:执行者以程序所有者权限运行
eg:普通用户执行passwd命令
# ls -ld /usr/bin/passwd
-rwsr-xr-x 1 root root 22960 Jul 17 2006 /usr/bin/passwd
文件属主为root,权限位rws:
s表示设置了SUID权限,且有执行权限(先有执行权限,然后再设置SUID权限)
S表示设置了SUID权限,无执行权限(先无执行权限,然后再设在SUID权限)
普通执行passwd命令分析:
1)执行passwd命令,底层操作的是/etc/shadow文件,查看/etc/shadow文件,虽然root用户显示为只读,但root
实际对所有文件、目录都有最高权限。
# ls -ld /etc/shadow
-r-------- 1 root root 1143 Sep 15 00:05 /etc/shadow
2)普通用户执行passwd命令时,由于/etc/bin/passwd文件有SUID权限,而普通用户对passwd有执行权限,所以会以文件属主的权限执行passwd命令,所以可以修改密码。以下是在普通用户执行passwd命令过程中,使用pstree命令跟踪到的,标红处表示,用户以root身份执行了passwd命令
#pstree -u
sshd-----sshd----bash
|--sshd----sshd(szb)---bash----passwd(root)
SGID
SGID针对文件
1.使用前提:
只针对二进制程序有效
执行者对于程序需要有x权限
2.SGID权限效果:
执行者以程序属组的权限运行
eg:locate命令
# ls -ld /usr/bin/locate
-rwx--s--x 1 root slocate 23856 Sep 19 2008 /usr/bin/locate
文件所属组为slocate,权限为s:
s表示设置了SGID权限,且有执行权限(之前有x权限,再设置SGID权限)
S表示设置了SGID权限,且无执行权限(之前无x权限,再设置SGID权限)
普通用户执行locate命令过程:
1)执行locate实际会访问/var/lib/mlocate/mlocate.db这个文件,而普通用户无权限
#ls -ld /var/lib/mlocate/mlocate.db
-rw-r----- 1 root slocate 1643399 Sep 14 14:12 /var/lib/mlocate/mlocate.db
2)普通用户执行locate命令,会以/usr/bin/locate文件属组的身份(权限),运行locate命令。而locate属组slocate对
mlocate.db文件有读权限,所以普通用户可以访问此文件。
SGID针对目录
1.使用前提:用户对设置SGID权限的目录有rwx权限
2.SGID权限效果:在此目录下创建的新文件会以此目录的属组作为新文件的属组。
举例:创建共享目录/pub,使public组中的用户对此目录有rwx权限
# groupadd public
# usermod -a -G public szb
# usermod -a -G public songzhibing
#mkdir /pub
#chgrp public pub
#chmod 770 pub
#chmod g+s /pub #添加SGID权限之前,public组中用户在从目录下创建的新文件,属组为用户本身。
#ls -ld /pub
-rwx-rws---- 1 szb public 0 Sep 17 13:20 szb.dir1
使用szb用户登陆,创建文件
$mkdir /pub/szb.dir1
$ls -ld /pub/szb.dir1
-rwx-rws-r-- 1 szb public 0 Sep 17 13:20 szb.dir1
#发现szb.dir1的权限未继承父目录(linux权限默认不继承,而是根据umask来计算,SGID除外,见标红)
粘着位SBIT
1.使用前提:
1)针对目录有效
2)当所有用户对目录拥有wx权限,A在此目录创建文件A.dir,那么由于用户B登陆后,可以删除A创建的文件
SBIT权限效果:用户在设置SBIT权限的目录下,创建的文件只有自己和root用户可以删除。
举例:
#mkdir /dir
#chmod o=rwx /dir
#chmod o+t /dir
#ls -ld /dir
drwxr-xrwt 2 root root 4096 Jun 30 09:30 /dir
t表示设置了SBIT权限,且有执行权限(之前有x权限,再设置SBIT权限)
T表示设置了SBIT权限,且无执行权限(之前无x权限,再设置SBIT权限)
用户szb登陆,创建szb.dir文件
$mkdir /dir/szb.dir
其他用户登陆,无法删除szb.dir文件
备注:查看哪些文件设置了特殊权限 #find / -perm /7000
文件系统访问列表 FACL
作用:可以设置特定用户或特定组针对一个文件的操作权限
setfacl [option] 文件名
-m:设定
u:用户名:权限 #设置额外属主及权限
g:组名:权限 #设置额外组组及权限
d:u:用户名:权限 #为某个目录设置默认的额外属主及权限(子文件自动继承)
d:g:组名:权限 #为某个目录设置默认的额外属组及权限(子文件自动继承)
-R 递归设置,让子文件继承父目录的FACL权限(单次生效)
-x 取消FACL权限
u:用户名
g:组名
-b #取消所有FACL设置,包括:默认FACL和FACL
getfacl 文件名 #查看FACL权限
举例:只让szb用户对root用户创建的/data有rwx权限
#mkdir data
#chnod 750 data
#ls -ld /data
drwxr-x--- 2 root root 4096 Sep 17 15:17 data
#mkdir data/root.data
#getfacl data
# file: data #文件名
# owner: root #所有者为root
# group: root #所有组为root
user::rw- #所有者权限
group::r-- #所有组权限
other::--- #其他用户权限
#setfacl -R -m u:szb:rwx data #递归添加额外属主szb,权限为rwx
#getfacl data
# file: data #文件名
# owner: root #所有者为root
# group: root #所有组为root
user::rwx #所有者权限
user:szb:rwx #额外属主szb,权限rwx
group::r-x #所有组权限
other::--- #其他用户权限
[root@localhost ~]# getfacl /data/root.data/
# file: data/root.data/
# owner: root
# group: root
user::rwx
user:szb:rwx #子文件也继承了父文件的FACL权限
group::r-x
mask::rwx
other::r-x
但是,root用户再创建一个文件,将不会自动继承父目录的FACL权限,解决方法:
1.再次递归设置,下下策。setfacl -R -m u:szb:rwx data
2.上上策,设置data的默认FACL权限
删除文件data的FACL额外属主szb的权限
#setfacl -x u:szb /data
默认FACL:对某个目录设置默认FACL权限,那么创建的子目录会自动继承这个目录的FACL权限。
承接上例:
#setfacl -d -m u:szb:rwx /data
[root@localhost ~]# getfacl /data/
getfacl: Removing leading '/' from absolute path names
# file: data/
# owner: root
# group: root
user::rwx
user:szb:rwx
group::r-x
mask::rwx
other::---
default:user::rwx
default:user:szb:rwx
default:group::r--
default:mask::rwx
default:other::---
备注:
#ls -ld /data
drwxr-x---+ 5 root root 4096 Jun 30 21:11 /data #加号表示设置了FACL权限
取消/data的额外属主szb的默认FACL权限
#setfacl -d -x u:szb /data