用户,组,权限
一、了解什么是用户,组和权限
1.对于linux系统来说,简单明了的特点就是多用户,多任务,也就是说一台linux系统的主机上面可以同时允许多个用户登录,当通过多个终端登录时可以同时使用这台linux的系统,然而对于linux习题来说,一切皆文件,别人和自己的工作任务都是以文件的形式存在的,不同的用户之间岂不是没有隐私或者安全而言,其实在linux上不是这样的,我们可以理解linux把每一个用户分配一间屋子,没有钥匙即权限我们是进不去浏览以及修改文件的,但是既然是一间屋子,那当然也可以允许很多人在一起做实验,而我们在linux中把这样的一子人称为"组";这样解释你们是否就很容易明白了?或者我们可以这样看
二、用户管理
当我们添加一个用户的时候,信息都写在什么地方?
/etc/passwd
#
[[email protected] ~]# head -n 3 /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 [[email protected] ~]#
#
分析一下用户信息文件的格式:
name:password:UID:GID:GECOS:directory:shell(man 5 passwd命令会显示出passwd文件的信息格式)
用户名:密码(当然是加密的):用户ID:组ID:注释:家目录:用户的shell
当然学习用户管理无非也就是这几个常用的简单命令:
useradd命令:添加用户
useradd [选项] 登录名
添加一个普通的用户
[[email protected] ~]# useradd www1 [[email protected] ~]#
对于添加用户,我们可以有这样的几种添加方式,
-c, --comment COMMENT:注释信息,一般为Full Name(全名);
[[email protected] ~]# useradd -c "YOUR NAME" www1 [[email protected] ~]#
下面一些简单的命令就不在于演示了:
-d, --home directory:家目录路径;目标路径不能事先存在,指定一个目录为该用户的家目录;
-g, --gid GROUP:指定用户的基本组组名或GID;
-G, --groups GROUP1(当然这里可以有多个组,[组1,组2...]):用户所属的附加组列表,彼此间用逗号隔开,中间没有空格;
-m, --create-home:强制创建家目录;
-M:不创建用户主目录,即使系统在 /etc/login.defs 中的设置 (CREATE_HOME) 为 yes;
-r, --system:创建一个系统账户
[[email protected] ~]# useradd -r www2
###此时注意观察www2的UID,一定是小于999的,因为管理员的UID是1-999
-s, --shell SHELL:用户的登录 shell 名,默认为留空,让系统根据 /etc/default/useradd 中的 SHELL 变量选择默认的登录shell;
[[email protected] ~]# cat /etc/default/useradd # useradd defaults file GROUP=100 HOME=/home INACTIVE=-1 EXPIRE= SHELL=/bin/bash SKEL=/etc/skel CREATE_MAIL_SPOOL=yes [[email protected] ~]#
-u, --uid UID:用户 ID 的数字值,用户的UID在centos7版本以上在1000以上,逐渐递增的
注意:创建登录用户时,为其自定义的shell程序必须为可登录shell,且要位于/etc/shells文件中;
下面是一些不常用的选项
useradd -D:显示创建用户时的默认设置;
useradd -D 选项:设置某默认选项;
-e, --expiredate EXPIRE_DATE:用户账号的过期期限;过期后会被锁定;日期以 YYYY-MM-DD 格式指定
-f, --inactive INACTIVE:密码过期后,账户被彻底禁用之前的天数。0 表示立即禁用,-1 表示禁用这个功能。
有增加就会修改和删除,我们来看一下:
usermod命令:修改账号信息,其实就是和添加用户的功能很相似
-c, --comment COMMENT
-d, --home HOME_DIR:修改家目录为新的位置,但一般应该同时使用-m选项以保证原家目录中的文件会移动到新目录中;
-g, --gid GROUP
-G, --groups GROUP1[,GROUP2,...[,GROUPN]]]:修改时会覆盖原有的附加组;一同使用-a选项,表示为用户添加新的附加组;
-l, --login NEW_LOGIN:修改当前用户的用户名;
-s, --shell SHELL更改用户的shell
-u, --uid UID重新指定用户的UID
-L, --lock:锁定用户的密码。这会在用户加密的密码之前放置一个“!”
-U, --unlock:解锁用户的密码。这将移除加密的密码之前的“!”
userdel命令:删除用户账号
userdel [选项] 登录名
-r, --remove:用户主目录中的文件将随用户主目录和用户邮箱一起删除
名称解析:groupname <--> gid
解析库:/etc/group
group_name:password:GID:user_list
组名称:组密码:组ID:组成员
passwd命令:密码修改或者管理的命令
当登录的用户执行passwd表示修改自己的密码
[[email protected] ~]# passwd Changing password for user root. New password: BAD PASSWORD: The password contains the user name in some form Retype new password: passwd: all authentication tokens updated successfully. [[email protected] ~]#
root可以修改所有人的密码
[[email protected] ~]# passwd www Changing password for user www. New password: BAD PASSWORD: The password is shorter than 8 characters Retype new password: passwd: all authentication tokens updated successfully. [[email protected] ~]#
由此可见,root修改用户的密码根本不用确定,当普通用户修改自己的密码时会首先要求验证当前的用户身份
passwd命令很简单,常用的几个选项:
选项:
-l:锁定密码
-u:解锁解密
-d:清除密码
从刚才的例子我们看出,修改的密码都是看不见的,因此我们可以通过管道的命令来确定我们输入密码的正确性,当然也有一定的风险,当然也只有root可以这样的使用
--stdin:从标准输入接收密码;
echo "PASSWORD" | passwd --stdin USERNAME [[email protected] ~]# echo "passwd" | passwd --stdin www Changing password for user www. passwd: all authentication tokens updated successfully. [[email protected] ~]#
这样是不是很清楚的呢?
当我们了解了用户相关用法后,我们要知道这两个文件,有关的配置文件
/etc/login.defs, /etc/default/useradd
同样,查看用户的基本信息命令还是很多的,比如
id命令:查看用户相关的id信息;
id [OPTION]... [USER]
-u:仅查看uid
-g:仅查看gid
-G:查看所属的所有组的ID;
-n:显示名称,而非ID;
su命令:switch user
切换用户时:我们一定要注意Linux中的一些细节问题
(1) 不读取目标用户的配置文件(非登录式切换,半切换);
su USERNAME
(2) 读取目标用户的配置文件(登录式切换,完全切换);
su -l USERNAME
su - USERNAME
三、组管理
和用户一样,有普通用户和系统用户,组不仅有系统组,普通用户组,还有私有组和附属组
什么是私有组:
私有组就是在用户产生的时候生成的一个与用户名相同的组,只有自己一个人管理和使用
附加组:私有组是用户自己的组,但是用户可以参加到别人的创建的组中去,这样的组我们称之为附加组
一样我们先了解增加的组信息存放在什么地方
/etc/group
[[email protected] ~]# cat /etc/group root:x:0: bin:x:1: daemon:x:2:
文件信息的格式:
root:$6$fUZ9o45Q$Hr99AVjiSppP9na6MvcjdgQmIc.sASPkArKakfd7T8PuYUqA54SPC7YHrD1xde5nrY/j9ShEj.KeoG89n59b9.:16866:0:99999:7:::
解析:loginname:加密的密码:密码使用的时间:允许密码修改使用最小时间:允许密码修改最大时间:密码警告时间
第一个$后面跟的是密码的算法等级
第二个$后面跟的是salt即产生的随机数
第三个$到"."是加密后的密码
【扩展延伸】
随机数:
熵池:就是存储随机输的地方
伪随机数:软件模拟产生;
用简单的话来说,加密后,我们会添加一些随机数进去,保证加密的等级,而首先我们就会在熵池中进行添加,当熵池中的随机数使用完,我们就需要软件模拟产生一些随机数,是不是有点模糊,了解一下
/dev/random:仅从熵池返回随机数,随机数耗尽时会阻塞进程;
/dev/urandom:先从熵池返回随机数,熵池耗尽时,则从伪随机数生成器返回随机数;
继续组的管理
groupadd命令:添加组
groupadd [选项] group
-g GID:指明GID;
-r, --system:系统组;
groupmod命令:修改组信息
groupmod [选项] GROUP
-g GID
-n NEW_NAME:修改组名;
groupdel命令:删除组
groupdel [选项] GROUP
影子口令文件:/etc/shadow
登录名:密码:最近一次的修改时间:密码的最短使用期限:密码最长使用期限:提前警告的天数:非活动期限:账号的禁用日期:保留字段
密码:$加密算法$salt$加密的密码字符串
gpasswd命令:为组添加密码
组密码文件:/etc/gshadow
gpasswd [选项] group
-a USERNAME:把用户添加至组中;
-d USERNAME:从此组中移除此用户;
newgrp命令:登录到一个新组
[[email protected] ~]# newgrp linux [[email protected] ~]# id uid=0(root) gid=1004(linux) groups=1004(linux),0(root) [[email protected] ~]#
chage命令:修改用户账号的各种期限;
四、权限管理:
文件或目录对用户显示的某种限制,比如读写执行,我的文件让谁看,让谁修改,让谁执行,这些都是有一定的权限,下面我们看看:
文件:
r:可获取文件的数据;
w:可修改文件的数据;
x:可将此文件运行为进程;
目录:
r:可使用ls命令获取其下的所有文件列表;但不可以使用“ls -l”去获取详细信息,也不可以cd至此目录中;
w:可修改此目录下的文件列表, 即可以在此目录下创建或删除文件;
x:可以使用"ls -l“命令来获取其下的文件的详细属性信息,也可cd至此目录中;
首先我们了解一写特殊的字符
u=user
g=group
o=other
a=(u+g+o)表示所有人
MODE:
赋权表示法:直接操作一类用户的所有权限位rwx;
u=
g=
o=
a=
[[email protected] test2]$ chmod u=rwx test2.txt [[email protected] test2]$ ll total 0 -rwxrw-r-- 1 www www 0 Mar 12 10:48 test2.txt [[email protected] test2]$
授权表示法:操作一类用户一位或多位权限(中间不使用逗号)
u+, u-
g+, g-
o+, o-
a+, a-
[[email protected] test]$ chmod a+x test.txt [[email protected] test]$ ll total 0 -rwxrwxr-x 1 www www 0 Mar 12 10:47 test.txt [[email protected] test]$
********************************************
[[email protected] test]$ chmod u-x,g-x,o-x test.txt [[email protected] test]$ ll total 0 -rw-rw-r-- 1 www www 0 Mar 12 10:48 test1.txt drwxrwxr-x 2 www www 22 Mar 12 10:48 test2 -rw-rw-r-- 1 www www 0 Mar 12 10:47 test.txt [[email protected] test]$
这样是不是更加的明白呢?
两类用户权限收授机制相同:ug+, ug-, ...
不同类的用户权限不同:u+,g+,o+
[[email protected] test]$ chmod ug-w test.txt [[email protected] test]$ ll total 0 -rw-rw-r-- 1 www www 0 Mar 12 10:48 test1.txt drwxrwxr-x 2 www www 22 Mar 12 10:48 test2 -r--r--r-- 1 www www 0 Mar 12 10:47 test.txt [[email protected] test]$
****************敲一敲代码看看是否一样呢?**************************
当然我们还是有别的表示方法的
r=4
w=2
x=1
[[email protected] test2]# chmod 646 test2.txt [[email protected] test2]# ll total 0 -rw-r--rw- 1 root root 0 Mar 12 10:48 test2.txt [[email protected] test2]#
常用选项:
-R, --recursive:递归修改;(小心使用哦)
[[email protected] tmp1]$ chmod -R a=rwx tmp2 [[email protected] tmp1]$ ll drwxrwxrwx 2 www www 42 Mar 12 10:56 tmp2 [[email protected] tmp1]$ cd tmp2 [[email protected] tmp2]$ ll -rwxrwxrwx 1 www www 0 Mar 12 10:56 1.txt -rwxrwxrwx 1 www www 0 Mar 12 10:56 2.txt -rwxrwxrwx 1 www www 0 Mar 12 10:56 3.txt [[email protected] tmp2]$
chown命令:
chown [OPTION]... [OWNER][:[GROUP]] FILE...
chown [OPTION]... --reference=RFILE FILE...
[[email protected] test2]# ll total 0 -rwxrw-r-- 1 www www 0 Mar 12 10:48 test2.txt [[email protected] test2]# chown root test2.txt [[email protected] test2]# ll total 0 -rwxrw-r-- 1 root www 0 Mar 12 10:48 test2.txt [[email protected] test2]#
看看上面发生什么,文件已经不是www的了
常用选项:
-R, --recursive:递归修改;
********************这一个就不演示了**************************
chgrp命令:
chgrp [OPTION]... GROUP FILE...
chgrp [OPTION]... --reference=RFILE FILE...
刚才我们把文件拥有者改了,那么组能不能改呢?
[[email protected] test2]# chgrp root test2.txt [[email protected] test2]# ll total 0 -rwxrw-r-- 1 root root 0 Mar 12 10:48 test2.txt [[email protected] test2]#
这完全可以说是自己创建的文件吗?哈哈 你看明白了吗
umask:显示或设定文件模式掩码
文件:
666-umask
[[email protected] test2]# ll total 0 -rw-r--r-- 1 root linux 0 Mar 12 11:11 1.txt [[email protected] test2]# umask 0022 [[email protected] test2]#
目录:
777-umask
[[email protected] test2]# ll total 0 -rw-r--r-- 1 root linux 0 Mar 12 11:11 1.txt drwxr-xr-x 2 root linux 6 Mar 12 11:14 nihao [[email protected] test2]# umask 0022 [[email protected] test2]#
注意:之所以文件用666去减,表示文件默认不能有执行权限;如果减得的结果中,u,g或o有执行权限时,则需要加1;
那我们在终端中看的更加仔细点吧
显示:
umask
管理员和普通用户的掩码还是不一样的累
你看?
管理员:
[[email protected] /]# umask 0022 [[email protected] /]#
普通用户
[[email protected] ~]$ umask 0002 [[email protected] ~]$
设定:
umask MASK
[[email protected] test2]# umask 0022 [[email protected] test2]# umask 0023 [[email protected] test2]# umask 0023 [[email protected] test2]#
注意:此设定仅对当前shell进程有效;