本博客内容来自《Linux命令行与shell脚本编程大全》第七章
目录
1、Linux的安全性
/etc/passwd文件
/etc/shadow文件
添加新用户
删除用户
修改用户
usermod命令
passwd和chpasswd命令
chsh、chfn和chage命令
2、使用Linux组
/etc/group文件
创建新组
修改组
3、理解文件权限
使用文件权限符
默认文件权限
4、改变安全性设置
改变权限
改变所属关系
chown命令
chgrp命令
Linux沿用了Unix文件权限的方法,允许用户和组根据每个文件和目录的安全性设置来访问文件。
Linux安全系统的核心是用户账户。
用户权限是通过创建用户时分配的用户ID(UID)来跟踪的。
/etc/passwd文件是Linux系统用来存储用户登录名与其对应UID值的,如下所示:
[root@izwz9194nuv8g0cwqfqsh3z skel]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
......
ntp:x:38:38::/etc/ntp:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
admin:x:1000:1000::/home/admin:/bin/bash
说明:以冒号为分割,有七个字段
登录用户名:用户密码:用户账号的UID:用户组ID:用户备注:用户HOME目录位置:用户默认shell
root用户是Linux管理员,默认UID是0。可以发现,Linux系统为各种功能都创建了不同的用户账户,但这些账户不是真的用户,而是系统账户,这样有人攻入某个服务也无法访问整个系统。Linux为系统账户预留了500以下的UID值。可以发现用户密码字段都被设置为x,出于安全考虑,用户密码字段都储存在另一个目录下/etc/shadow。
该文件只有root用户能访问,比上面的/etc/passwd更安全。里面保存了每个用户账户的密码记录,如下所示:
[root@izwz9194nuv8g0cwqfqsh3z skel]# cat /etc/shadow
root:$6$T7cTM/M3XjUOXG7GyLRNWz7pAOrjCrUYyCBuzTM9fRR.:17947:0:99999:7:::
bin:*:17110:0:99999:7:::
daemon:*:17110:0:99999:7:::
adm:*:17110:0:99999:7:::该记录中有9个字段:
用户名:加密密码:距离上次修改密码时间:多少天后可更改密码:多少天后必须修改密码:密码过期前几天提醒用户:密码过期几天后禁用用户账户:用户被禁日期:预留字段
添加新用户主要使用useradd命令,使用-D参数(default)查看添加新用户的默认值:
[root@izwz9194nuv8g0cwqfqsh3z skel]# useradd -D
GROUP=100 ##新用户会被添加到的用户组ID
HOME=/home ##新用户的HOME目录会位于/home/loginname
INACTIVE=-1 ##新用户的账号密码过期后不会被禁
EXPIRE= ##新用户账户不设置过期日期
SHELL=/bin/bash ##新用户默认shell
SKEL=/etc/skel ##系统将该目录下内容复制到用户的HOME目录下
CREATE_MAIL_SPOOL=yes ##创建用于接收邮件的文件可以直接更改这些系统默认值,使用-D选项后面再加参数即可,参数主要有:
-b default_home :更改默认的用户HOME目录位置
-e date :更改默认的过期日期
-f inactive :更改默认的从密码过期到账户被禁天数
-g group:更改默认的组名称或GID
-s shell:更改默认的登录shell
如:useradd -D -s /bin/tsch即可更改
很好玩的地方在于/etc/skel目录下有几个隐藏文件,这个目录也是创建新用户HOME目录的模板:
[root@izwz9194nuv8g0cwqfqsh3z skel]# ll -a
total 20
drwxr-xr-x. 2 root root 4096 Apr 11 2018 .
drwxr-xr-x. 83 root root 4096 Feb 24 10:27 ..
-rw-r--r-- 1 root root 18 Oct 31 01:07 .bash_logout
-rw-r--r-- 1 root root 193 Oct 31 01:07 .bash_profile #文件具体用法见博客
-rw-r--r-- 1 root root 231 Oct 31 01:07 .bashrc
在创建新用户时使用 -m 参数可以指定创建HOME目录(默认也会创建)
[root@izwz9194nuv8g0cwqfqsh3z skel]# cd /home
[root@izwz9194nuv8g0cwqfqsh3z home]# ll
total 4
drwx------ 3 admin admin 4096 Feb 20 14:16 admin
[root@izwz9194nuv8g0cwqfqsh3z home]# useradd -m test
[root@izwz9194nuv8g0cwqfqsh3z home]# ll
total 8
drwx------ 3 admin admin 4096 Feb 20 14:16 admin
drwx------ 2 test test 4096 Feb 24 14:38 test
其他用法主要有:
1.-d参数用于指定主目录(不使用默认路径)
[root@izwz9194nuv8g0cwqfqsh3z home]# useradd -d /home/testfile tast
[root@izwz9194nuv8g0cwqfqsh3z home]# ll
total 16
drwx------ 3 admin admin 4096 Feb 20 14:16 admin
drwx------ 2 tast tast 4096 Feb 24 14:45 testfile2.-M参数 不创建用户的HOME目录
3.-n参数 创建与用户登录名同名的新组
4.-r参数 创建系统账户
5.-p passwd参数 为用户账户指定默认密码
6.-s shell 指定默认的登录shell
7.-u uid 为账户指定唯一的UID
删除用户命令很简单,直接使用
userdel 用户名
如果想把该用户的HOME目录和邮件目录也删除,可以加上 -r 参数,但要小心,记得确保该用户HOME目录下没有其他用户的文件:
user -r 用户名
最强大的用户账户修改工具,能用来修改/etc/passwd文件中的大部分字段,只需要用需要修改的字段对应的命令行参数即可。参数大部分与上面修改useradd默认参数(-e/-g等),此外还有一些参数:
选项:
-c COMMENT 修改/etc/passwd文件第五段comment
-d HOME_DIR 修改用户的HOME目录,通常和-m选项一起使用
-e EXPIRE_DATE 将帐户到期日期设置为EXPIRE_DATE,格式YY-MM-DD
-f INACTIVE 在到期后设置密码无效,0表示密码已过期就禁用帐号,-1表示禁用此功能,默认值是-1
-g GROUP 强制使用GROUP作为新的主要组(会改变用户的默认组)
-G GROUPS 把用户追加到某些组中,会把用户从别的组移除(但是不改变用户的默认组)
-a 把用户追加到某些组中,添加的时候不会把该用户从别的组移除,仅与-G选项一起使用
-l NEW_LOGIN 修改用户账户的登录名
-L 锁定账户,使用户无法登录
-m 修改用户的HOME目录,通常和-d选项一起使用
-o 允许使用重复(非唯一)UID
-p PASSWORD 使用加密密码作为新密码
-R CHROOT_DIR 目录到chroot
-s SHELL 用户帐户的新登录shell
-u UID 用户帐户的新UID
-U 解除锁定,使用户能够登录
-Z SEUSER 用户帐户的新SELinux用户映射注意:以上红字提到的默认组,其在/etc/passwd的GID字段中定义
追加用户到用户组,使用 -aG 参数,例如:
[root@izwz9194nuv8g0cwqfqsh3z home]# useradd test ##添加用户
[root@izwz9194nuv8g0cwqfqsh3z home]# groupadd testgroup ##添加用户组
[root@izwz9194nuv8g0cwqfqsh3z home]# ll
total 8
drwx------ 3 admin admin 4096 Feb 20 14:16 admin
drwx------ 2 test test 4096 Feb 24 15:06 test
[root@izwz9194nuv8g0cwqfqsh3z home]# usermod -aG testgroup test ##追加用户到用户组
[root@izwz9194nuv8g0cwqfqsh3z home]# id test
uid=1004(test) gid=1004(test) groups=1004(test),1005(testgroup) ##可以看到追加成功
修改test用户的HOME目录,使用-md参数:
#usermod -md /home/usertest test
passwd命令可以改变用户密码:
[root@izwz9194nuv8g0cwqfqsh3z testfile]# passwd test
Changing password for user test.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
系统上任何用户都可以用该命令修改自己的密码,但只有root用户有权限修改别人的密码。
-e选项能强制用户下次登录时修改密码。
chpasswd命令可以给大量用户修改密码,它能自动读取登录名和密码对(冒号分割)列表然后完成用户密码修改。可以用重定向命令来输入文件流给该命令:
#chpasswd < users.txt
chsh命令用来快速修改用户登录shell:
#chsh -s /bin/csh test
chfn命令用来修改用户备注信息,fn是指Unix中的finger命令,出于安全性考虑,该命令在Linux上一般被禁用。
[root@izwz9194nuv8g0cwqfqsh3z testfile]# chfn test
Changing finger information for test.
Name []: heylin
Office []: school
Office Phone []: 119
Home Phone []: 119Finger information changed.
然后你会在/etc/passwd中看到:
[root@izwz9194nuv8g0cwqfqsh3z testfile]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
......
test:x:1004:1004:heylin,school,119,119:/home/testfile:/bin/bash
chage命令用来帮助管理用户账户的有效期。
-d : 设置上次修改密码到现在的天数
-E:设置密码过期日期,过期后锁定
-I :设置密码过期到锁定账户的天数
-m:设置修改密码之前最少多少天
-W:设置密码过期前多久开始提醒
日期值可以有两种:
YYYY-MM-DD格式
从1970年1月1日到该日期的天数
Linux采用组的安全概念来对共享资源的用户进行安全控制。
每个组都由唯一的GID,与UID类似,还有组名。一般新创建一个用户时系统即新创建一个组,更加安全。
在/etc/group文件中存储了所以组信息,系统账户的GID通常小于500:
[root@izwz9194nuv8g0cwqfqsh3z testfile]# cat /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:test:x:1004:
testgroup:x:1005:test
说明:
四个字段 组名:组密码:GID:属于该组的用户列表
注意:
当一个用户在/etc/passwd文件中指定某个组作为默认组时,用户账户不会作为该组成员再出现在/etc/group文件中,如上面的test用户,他也在test组,但是没有显示,/etc/passwd文件显示如下所示,test默认组GID为1004(test),但可以看到上面test组成员没有写test:
test:x:1004:1004:heylin,school,119,119:/home/testfile:/bin/bash
不能直接修改该文件来添加用户到组,要用前面提到的usermod命令。
创建新组使用groupadd命令
[root@izwz9194nuv8g0cwqfqsh3z testfile]# groupadd shared ##添加新组
[root@izwz9194nuv8g0cwqfqsh3z testfile]# tail -n 5 /etc/group
docker:x:993:
hailin:x:1003:
test:x:1004:
testgroup:x:1005:test ##test原来在testgroup组
shared:x:1006: ##添加新组成功
[root@izwz9194nuv8g0cwqfqsh3z testfile]# usermod -G shared test ##分配test用户到该组
[root@izwz9194nuv8g0cwqfqsh3z testfile]# usermod -G shared hailin ##分配hailin用户到该组
[root@izwz9194nuv8g0cwqfqsh3z testfile]# tail -n 5 /etc/group
docker:x:993:
hailin:x:1003:
test:x:1004:
testgroup:x:1005: ##-G参数,test被移除出testgroup组
shared:x:1006:test,hailin ##添加用户成功
[root@izwz9194nuv8g0cwqfqsh3z testfile]# usermod -aG testgroup test ##-a参数
[root@izwz9194nuv8g0cwqfqsh3z testfile]# tail -n 5 /etc/group
docker:x:993:
hailin:x:1003:
test:x:1004:
testgroup:x:1005:test ##添加用户成功,使用-a参数,不会将用户从原组移除
shared:x:1006:test,hailin ##test未被移除注意:不要使用-g选项,否则指定的组名会替换掉该账户的默认组。
/etc/group文件中信息不多,能修改的也就GID(-g选项)和组名(-n选项)
[root@izwz9194nuv8g0cwqfqsh3z testfile]# groupmod -n sharing shared
[root@izwz9194nuv8g0cwqfqsh3z testfile]# tail -n 5 /etc/group
docker:x:993:
hailin:x:1003:
test:x:1004:
testgroup:x:1005:test
sharing:x:1006:test,hailin
通过ll命令可以查看Linux上的文件、目录和设备的权限:
[root@izwz9194nuv8g0cwqfqsh3z ~]# ll
total 24
-rw-r--r-- 1 root root 49 Feb 21 15:55 file1
-rw-r--r-- 1 root root 7 Feb 20 15:28 hailin
lrwxrwxrwx 1 root root 6 Feb 20 16:04 link -> hailin
drwxr-xr-x 2 root root 4096 Feb 20 15:35 mod_test
以上红色部分就是描述文件和目录权限的编码:
第一个字符:
-代表文件
d代表目录
l代表链接
c代表字符型设备
b代表块设备
n代表网络设备
之后3组三字符的编码 rwx、rw-、r--、r-x等:
r可读,八进制值为4(二进制100)
w可写,八进制值为2(二进制010)
x可执行,八进制值为1(二进制001)
3组权限分别对应于文件或目录所属的用户、用户组和系统的其他用户。以file1为例:
-rw-r--r-- 1 root root 49 Feb 21 15:55 file1
rw- :文件属主 权限码 6
r-- :文件所属用户组 权限码 4
r--:系统其他用户 权限码 1
八进制模式的值即为 641
文件默认权限设置命令为 umask。查看系统默认umask值:
[root@izwz9194nuv8g0cwqfqsh3z ~]# umask
0022注意,第一个0为粘着位,后面三位是文件或目录对应的umask八进制值
文件的全权限值为666(所有用户有读写权限),目录的全权限值为777(所有用户有读写和执行权限)
[root@izwz9194nuv8g0cwqfqsh3z ~]# touch umasktest
[root@izwz9194nuv8g0cwqfqsh3z ~]# ll
-rw-r--r-- 1 root root 0 Feb 24 16:35 umasktest
可以看到创建文件对应八进制权限为644,而文件全权限值为666,减去umask的022就得到644了。
所以umask掩码会屏蔽掉不想授予该安全级别的权限。
默认的umask值在/etc/profile文件中定义,Ubuntu系统可能会放在/etc/login.defs文件中。
修改umask值很简单,执行:
[root@izwz9194nuv8g0cwqfqsh3z ~]# umask 026
[root@izwz9194nuv8g0cwqfqsh3z ~]# touch newfile
[root@izwz9194nuv8g0cwqfqsh3z ~]# ll
-rw-r----- 1 root root 0 Feb 24 16:39 newfile
可以看到newfile的八进制权限值为640,这个值也会对创建目录生效
权限改变使用chmod命令,其格式为:
#chmod options mode file
mode参数可以用前面提到的八进制权限值,直观方便:
[root@izwz9194nuv8g0cwqfqsh3z ~]# chmod 760 newfile
[root@izwz9194nuv8g0cwqfqsh3z ~]# ll
-rwxrw---- 1 root root 0 Feb 24 16:39 newfile
也可以用符号修改:
第一个符号:
u代表用户
g代表组
o代表其他用户
a代表所有
第二个符号:
+:增加权限
-:删除权限
第三个符号:
x 执行权限
r 写权限
w 读权限
例如:
#chmod o+r newfile
改变文件的属主,使用chown命令,只有root可以改变所有文件的属主。
使用格式为:
#chown options owner[.group] file
使用登录名或者UID来指定文件新的属主:
[root@izwz9194nuv8g0cwqfqsh3z ~]# chown test newfile
[root@izwz9194nuv8g0cwqfqsh3z ~]# ll
-rwxrw---- 1 test root 0 Feb 24 16:39 newfile
也可以同时改变文件的属主(用户)和用户组:
[root@izwz9194nuv8g0cwqfqsh3z ~]# chown hailin.test newfile
[root@izwz9194nuv8g0cwqfqsh3z ~]# ll
-rwxrw---- 1 hailin test 0 Feb 24 16:39 newfile
只改变用户组:
[root@izwz9194nuv8g0cwqfqsh3z ~]# chown .root newfile
[root@izwz9194nuv8g0cwqfqsh3z ~]# ll
-rwxrw---- 1 hailin root 0 Feb 24 16:39 newfile
chown命令常用的参数有 -R ,递归的改变子目录和文件的所属关系。
-h 参数可以改变文件的所有符号链接文件的所属关系。
改变文件的默认属主,使用chgrp命令
[root@izwz9194nuv8g0cwqfqsh3z ~]# ll
-rw-r--r-- 1 root root 7 Feb 20 15:28 hailin[root@izwz9194nuv8g0cwqfqsh3z ~]# chgrp test hailin
[root@izwz9194nuv8g0cwqfqsh3z ~]# ll
-rw-r--r-- 1 root test 7 Feb 20 15:28 hailin