学习到这里,我发现我的macOS系统已经不够用了,又不想在自己的电脑上装Linux系统,所以是时候真正的搞个Linux系统来练习了,于是我就在京东云上申请了个免费的云服务器,系统是CentOS 7.2 64位(新用户免费一个月)继续学习
命令 | 作用 |
---|---|
useradd |
创建一个账户 |
userdel |
删除账户 |
usermod |
修改账户 |
passwd |
修改密码 |
chpasswd |
批量修改密码 |
chsh |
修改用户登录的默认shell |
chage |
命令配合参数修改各种账户的有效期 |
groupadd |
创建组 |
groupmod |
修改组 |
umask |
修改文件默认权限 |
chmod |
已创建文件权限修改 |
chown |
改变文件属主或属组 |
chgrp |
改变文件的属组 |
1.Linux的安全性
Linux安全系统的核心用户账户,每一个进入Linux系统的用户都会有一个唯一分配的账户,用户对各种对象的访问权限取决于他们登录系统时用的账户
每个账户有唯一的UID,有自己的密码,有自己的登录名,系统只要控制每个账户的权限,就可以控制整个系统的安全
passwd文件 将登录名和UID匹配的文件
做下面的操作 cat /etc/passwd
,查看passwd文件内容
[root@jdu4e00u53f7 ~]# 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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
systemd-network:x:998:996:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:997:995:User for polkitd:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
centos:x:1000:1000:Cloud User:/home/centos:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
文件中列出了各种账户,这些账户叫做系统账户,主要作用是各种进程之间访问资源,就像前面说的,所有运行的服务都要有一个系统账户登录到Linux系统上,才会拿到系统资源
*注意 上面第二行的root账户是Linux的系统管理员,他的UID固定是0
下面以root账户为例介绍一下上面的文件中的内容都代表什么
root:x:0:0:root:/root:/bin/bash
信息(以: 分隔) |
描述 |
---|---|
root | 用户登录名 |
x | 用户密码 |
0 | 用户账户的UID |
0 | 用户账户的组ID(GID) |
root | 用户账户的文本描述 |
/root | 用户HOME目录的位置 |
/bin/bash | 用户的默认shell |
*注意 大家会发现密码都是x,其实不是的,为了安全起见,密码被单独保存在另外一个叫shadow的文件中,下面介绍一下这个文件
做如下操作 cat /etc/shadow
[root@jdu4e00u53f7 ~]# cat /etc/shadow
root:$6$Z9Jjj18u77$70syd1z4TXOBY1O1I9z.:17393:0:99999:7:::
bin:*:16659:0:99999:7:::
daemon:*:16659:0:99999:7:::
adm:*:16659:0:99999:7:::
lp:*:16659:0:99999:7:::
sync:*:16659:0:99999:7:::
shutdown:*:16659:0:99999:7:::
halt:*:16659:0:99999:7:::
mail:*:16659:0:99999:7:::
operator:*:16659:0:99999:7:::
games:*:16659:0:99999:7:::
ftp:*:16659:0:99999:7:::
nobody:*:16659:0:99999:7:::
avahi-autoipd:!!:17151::::::
systemd-bus-proxy:!!:17151::::::
systemd-network:!!:17151::::::
dbus:!!:17151::::::
polkitd:!!:17151::::::
tss:!!:17151::::::
postfix:!!:17151::::::
sshd:!!:17151::::::
centos:!!:17345:0:99999:7:::
nscd:!!:17382::::::
ntp:!!:17382::::::
下面还是以root账户为例介绍一下上面的文件中的内容都代表什么
root:$6$Z9Jjj18u77$70syd1z4TXOBY1O1I9z.:17393:0:99999:7:::
信息(以: 分隔) |
描述 |
---|---|
root | 和passwd文件对应的用户名 |
$6$Z9Jjj18u77$70syd1z4TXOBY1O1I9z. | 加密后的用户密码 |
17393 | 距离上次修改密码后的天数(自1970.1.1开始计算) |
0 | 多少天后才能更改密码 |
99999 | 多少天后必须更改密码 |
7 | 密码过期前提前多少天提醒用户更改密码 |
*注意 后面还有两个::
他们中间的信息分别是
密码过期后多少天禁用用户账户
用户账户被禁用日期
预留字段给将来使用
添加新用户 useradd
useradd
命令会创建一个账户,他有许多参数,这里有个链接useradd命令详解
创建时可以根据对应的参数,设置账户的具体信息
如果不填写这些参数,系统会为新用户默认添加一些信息,这些信息可以用命令/usr/sbin/useradd -D
查看,如下
例:
[root@jdu4e00u53f7 ~]# /usr/sbin/useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
这些信息从上到下分别是账户组ID(GID)、账户的HOME目录位置、密码过期后不会被禁用、账户未设置账户过期日期、新账户的默认shell、系统会将/etc/skel的文件复制到用户的HOME目录下、创建一个用于接收邮件的文件
*注意 SKEL=/etc/skel
意识是将/etc/skel的文件复制到用户的HOME目录下,实际上这些复制的文件就是bash shell的标准启动文件
*注意 useradd
默认不会创建HOME目录,必须添加参数-m
才可以
下面是创建一个默认账户的例子
[root@jdu4e00u53f7 ~]# useradd -m test
[root@jdu4e00u53f7 ~]# ls -al /home/test
总用量 12
drwx------ 2 test test 59 8月 15 15:47 .
drwxr-xr-x. 4 root root 30 8月 15 15:47 ..
-rw-r--r-- 1 test test 18 12月 7 2016 .bash_logout
-rw-r--r-- 1 test test 193 12月 7 2016 .bash_profile
-rw-r--r-- 1 test test 231 12月 7 2016 .bashrc
*注意 不传参数创建的账户的默认信息也是可以更改的,例如useradd -D -s /bin/tsch
就会将创建的账户的默认shell更改为tsch
下面是更改默认值的参数介绍
参数 | 描述 |
---|---|
-b | 更改默认HOME目录位置 |
-e | 更改默认新账户的过期日期 |
-f | 更改默认新用户从密码过期到禁用的天数 |
-g | 更改默认组 |
-s | 更改默认登录shell |
删除用户 userdel
userdel
只是删除passwd文件中的关于该账户的信息,而不会删除其他该账户的文件
例:userdel test
加上-r
参数会删除用户的HOME目录以及邮件目录,但是系统上仍有可能存在删除账户的其他文件
例:userdel -r test
*注意 使用-r
参数时要小心,因为你不知道在删除账户的HOME目录下是否存放着其他用户的重用文件
修改用户
下面是一些修改用户的常用命令
参数 | 描述 |
---|---|
usermod | 修改用户账户的字段,还可以指定主要组以及附加组的所属关系 |
passwd | 修改密码 |
chpasswd | 从文件中读取登录名密码对,更新密码 |
chage | 修改密码过期日期 |
chfn | 修改账户的备注信息 |
chsh | 修改默认登录shell |
下面介绍一下这几个命令
usermod
能够修改/etc/passwd文件中的大部分字段,参数和useradd
差不多,例如: -c
修改备注字段、-e
修改过去日期等,除此之外有几个很有用的参数
-l
修改用户账户的登录名
-L
锁定账户
-p
修改账户密码
-U
解除锁定
例:
usermod -l test1 test
将账户test的登录名改为test1
passwd
修改密码,看下面的例子:
[root@jdu4e00u53f7 ~]# passwd test
更改用户 test 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
抱歉,密码不匹配。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
*注意 从修改失败的提示可以看出,密码是有要求的,必须不少于8个字符另外还不可以是纯数字
*注意 只有root用户和用户本省可以修改自己的密码
chpasswd
可批量修改用户密码,该命令能够从标准输入读取用户名和密码对列表,分别修改
chsh
修改用户登录的默认shell
例:
[root@jdu4e00u53f7 ~]# chsh -s /sbin/nologin test
Changing shell for test.
Shell changed.
chfn
会将用于finger
命令的信息存储进备注字段
[root@jdu4e00u53f7 ~]# chfn test
Changing finger information for test.
名称 []: This is a test
办公 []: test
办公电话 []: 12344445555
住宅电话 []: 12344445555
Finger information changed.
*注意 由于finger
命令可以简单的查到用户信息,所以很多Linux发行版上都没有默认安装该命令
经过上面的一系列修改,现在查看test账户是这样的
test:x:1001:1001:This is a test,test,12344445555,12344445555:/home/test:/sbin/nologin
chage
命令配合参数修改各种账户的有效期
参数 | 描述 |
---|---|
-d |
设置上次修改密码到现在的天数 |
-E |
设置密码过期的天数 |
-I |
设置密码过期到锁定账户的天数 |
-m |
设置修改密码之间最少要多少天 |
-w |
设置密码过期前多久出现提醒信息 |
*注意 输入日期的格式有两种,一种是YYYY-MM-DD的格式,一种是1970年1月1日到该日期的天数
2.使用Linux组(GID)
当多个账户要共享资源时,组的存在就很有用了,每个组有自己的权限,每个组下有多个用户,这些用户共享组的权限
查看组信息 /etc/group文件中
例:查看组信息 cat /etc/group
[root@jdu4e00u53f7 ~]# cat /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:centos
tty:x:5:
test:x:1001:
以adm:x:4:centos
组为例介绍下信息
信息(以: 分隔) |
描述 |
---|---|
adm | 组名 |
x | 组密码 |
4 | 组ID(GID) |
centos | 属于该组的用户列表 |
*注意 添加用户到组可以用usermod
命令,不能直接通过修改文件操作
*注意 组的用户列表信息会误导人,列表中有很多组后面没有这个信息,不代表该组下没有用户,当用户在/etc/passwd文件中指出默认组的时候,该成员就不会出现在这个信息中
创建组 groupadd
例:创建一个叫test_group的组
/usr/sbin/groupadd test_group
例: 将test用户添加到test_group组中
/usr/sbin/usermod -G test_group test
这时查看test_group的信息为
test_group:x:1002:test
*注意 只能用户添加到组中,不能组主动添加某个用户
*注意 更改登录系统用户所属的用户组,必须登录用户登出在登录后才会生效
*注意 -G
参数的作用是将用户添加到组的列表中,还有一个参数-g
是将账户的默认组设定为指定的组名
修改组 groupmod
groupmod
有两个有用的参数
-g
修改组的GID
-n
修改组名
例: 将组名test_group改为test_group1
/usr/sbin/groupmod -n test_group1 test_group
*注意 改组名不会影响组的权限,应为权限是根据GID来的
3.文件权限
首先用ls -l
命令查看下系统上的文件,取出其中一条,介绍下文件权限
以下面这条信息为例:
dr-xr-xr-x. 2 root root 20480 8月 8 18:40 bin
其中第一个参数dr-xr-xr-x
就表示了文件的权限
这是一个10个字符的字符串,第一位代表对象的类型
上例中的d
代表目录,还有其他的
参数 | 代表 |
---|---|
- | 代表文件 |
d | 代表目录 |
l | 代表连接 |
c | 代表字符型设备 |
b | 代表块设备 |
n | 代表网络设备 |
后面的9个字符分为三组,从前往后分别表示文件属主的权限、属组成员的权限和其他用户的权限
每组由三个字符构成,每个字符分别代表不同的意思
参数 | 代表 |
---|---|
- | 无操作 |
r | 可读 |
w | 可写 |
x | 可执行 |
这三个字符的组合会有8中形式,与八进制转二进制的前八中组合对应
参数 | 二进制值 | 八进制值 | 权限描述 |
---|---|---|---|
--- | 000 | 0 | 无任何权限 |
--x | 001 | 1 | 可执行 |
-w- | 010 | 2 | 可写 |
-wx | 011 | 3 | 可写可执行 |
r-- | 100 | 4 | 可读 |
r-x | 101 | 5 | 可读可执行 |
rw- | 110 | 6 | 可读可写 |
rwx | 111 | 7 | 可读可写可执行 |
结合上面的介绍,上面那句话的意思是
登录名为root
的用户可以读可以执行,root
组的成员可读可执行,不属于root
组的用户可读可执行
文件默认权限修改 umask
首先我们创建一个文件
[root@jdu4e00u53f7 ~]# touch newfile
[root@jdu4e00u53f7 ~]# ls -al newfile
-rw-r--r-- 1 root root 0 8月 16 15:34 newfile
这个文件的默认权限是-rw-r--r--
这个默认的权限对应的就是umask
的权限
查看umask
命令
[root@jdu4e00u53f7 ~]# umask
0022
对于输出结果我们可能已经懵逼了,到底什么意思,似乎和想象的不太一样
首先第一位代表的是安全特性,叫做粘着位,后面会介绍,后面三位代表的是权限,但是似乎和应该的八进制数不太吻合,正常rw-r--r--
对应的二进制应该是110100100
对应的八进制应该是644
为什么这里显示的是022
实际上这里显示的是掩码,对于文件来说,全权限值是666
(可读可写可执行),减掉对应的644
就是022
了
*注意 对于目录来说,全权限值是777
可以用umask
命令设置umask
的默认值
例如umask 026
,就将默认的文件权限变成了640
,默认的目录权限751
上面介绍的是改变默认的文件权限,下面介绍一下已经创建好的文件权限
已创建文件权限修改 chmod
例:
[root@jdu4e00u53f7 ~]# chmod 660 newfile
[root@jdu4e00u53f7 ~]# ls -al newfile
-rw-rw---- 1 root root 0 8月 16 15:34 newfile
修改权限相对来说就比较友好,后面直接跟八进制的数字就好
除了上面的直接修改,还有一种符号模式的修改,相对来说复杂一些,格式是
[ugoa][+-=][rwxXstugo]
其中第一个中括号中代表要修改的目标
参数 | 目标 |
---|---|
u | 代表用户 |
g | 代表组 |
o | 代表其他 |
a | 代表上诉所有 |
第二个中括号中的参数代表增加减少或者直接设置成后面的权限
第三个中括号是权限,会发现比普通的rwx
多,增加参数的权限描述如下
参数 | 目标 |
---|---|
X | 如果对象是目录或者它已有执行权限,赋予执行权限 |
s | 运行时重新设置UID或GID |
t | 保留文件或目录 |
u | 将权限设置为跟属主一样 |
g | 将权限设置为跟属组一样 |
o | 将权限设置为跟其他用户一样 |
用例子解释:
[root@jdu4e00u53f7 ~]# chmod o+r newfile
[root@jdu4e00u53f7 ~]# ls -al newfile
-rw-rw-r-- 1 root root 0 8月 16 15:34 newfile
上面的例子就是为newfile
文件的其他用户增加可写权限
改变文件所属关系 chown chgrp
chown
改变文件属主或属组
将newfile文件的属主设定为test用户
例:
[root@jdu4e00u53f7 ~]# chown test newfile
[root@jdu4e00u53f7 ~]# ls -l newfile
-rw-rw-r-- 1 test root 0 8月 16 15:34 newfile
chown
命令还可以同时改变文件的属主和属组
例:
[root@jdu4e00u53f7 ~]# chown test.test newfile
[root@jdu4e00u53f7 ~]# ls -l newfile
-rw-rw-r-- 1 test test 0 8月 16 15:34 newfile
chown
命令改变文件的属组
例:
[root@jdu4e00u53f7 ~]# chown .root newfile
[root@jdu4e00u53f7 ~]# ls -l newfile
-rw-rw-r-- 1 test root 0 8月 16 15:34 newfile
如果属主和属组名字相同可用下面的写法将其同时修改
例:
[root@jdu4e00u53f7 ~]# chown test. newfile
[root@jdu4e00u53f7 ~]# ls -l newfile
-rw-rw-r-- 1 test test 0 8月 16 15:34 newfile
*注意 只有root用户才能改变文件的属主
chown
改变默认属组
例:
[root@jdu4e00u53f7 ~]# chgrp root newfile
[root@jdu4e00u53f7 ~]# ls -l newfile
-rw-rw-r-- 1 test root 0 8月 16 15:34 newfile
4.共享文件
文件共享是通过GID来实现的,我们知道,新建的文件,都会分配默认的UID和GID,要想让其他人能够使用该文件,要么改变其他用户的所在组的访问权限,要么就给文件分配一个包含其他用户的新默认属组
下面用例子说明
例:
创建一个文件夹,作为要共享的文件夹
[root@jdu4e00u53f7 ~]# mkdir testdir
[root@jdu4e00u53f7 ~]# ls -l
总用量 0
drwxr-xr-x 2 root root 6 8月 16 18:08 testdir
将文件夹的默认属组改成包含要用这个文件夹的用户的组test
[root@jdu4e00u53f7 ~]# chgrp test testdir/
[root@jdu4e00u53f7 ~]# ls -l
总用量 0
drwxr-xr-x 2 root test 6 8月 16 18:08 testdir
保证目录中新建的文件都用test组作为默认属组
[root@jdu4e00u53f7 ~]# chmod g+s testdir/
[root@jdu4e00u53f7 ~]# ls -l
总用量 0
drwxr-sr-x 2 root test 6 8月 16 18:08 testdir
[root@jdu4e00u53f7 ~]# cd testdir/
[root@jdu4e00u53f7 testdir]# touch testfile
[root@jdu4e00u53f7 testdir]# ls -l
总用量 0
-rw-rw-r-- 1 root test 0 8月 16 18:10 testfile
这样操作后,不管是谁在该目录下创建新文件,新文件的属组都是目录的默认属组,而不是用户的默认属组,这样,test组下所有的用户都能访问这个文件了
*注意 上面用到了前面介绍的改变权限的一个属性s
运行时重新设置UID或GID
*注意 其实共享文件涉及到Linux为文件或目录存储的额外三个信息SUID(设置用户ID)、SGID(设置组ID)和粘着位,但是这里不想过多的介绍,那样容易乱,感兴趣的同学可自行了解
*注意 上面的例子主要用的就是SGID,启用SGID位后,可以强制在一个目录下创建的文件都属于该目录的属组,这样就达到了共享的目的