第四章:用户和组管理
1.基本概念
1.1.UID&GID
Linux是通过UID和GID号来识别用户和组。对某个文件或程序的访问也是以UID和GID为基础。一个执行中的程序继承了调用它的用户的权利和访问权限。
1.2.Linux用户类型
- 根用户(0):UID为0的用户,能够访问系统任何文件和程序,而不论root根用户是否有权限。root用户通常称为“超级用户”
- 系统/服务用户(1-999):UID为1-999.系统保留账号,或者某些服务才能使用的的账号
- 普通用户(大于1000):UID大于1000,只能访问他们拥有的或者有权限执行的文件
1.3.用户根目录
- 每一个登入系统的用户都需要有地方保存那些专属于该用户的配置文件,这个目录就是用户根目录(home directory),类似于windows中的c:\Documents and Settings
- root用户的根目录对于大多数Unix/Linux操作系统来说都处于“/root”下
- 普通用户的主目录位于“/home/yourname”(yourname是用户名)下,类似于windows下的c:\Documentsand Settings
1.4.用户脚本文件
Linux系统中,每个用户根目录下都有几个隐藏的脚本文件
例:查看root根目录下的几个脚本文件
[[email protected] ~]# ls -a . .bashrc Documents .local Videos .. .cache Downloads Music .viminfo anaconda-ks.cfg .config .esd_auth Pictures .bash_history .cshrc gyh Public .bash_logout .dbus .ICEauthority .tcshrc .bash_profile Desktop initial-setup-ks.cfg Templates |
.bash_history :命令历史记录
.bash_logout :退出shell时执行此脚本
.bash_profile :登陆shell时执行此脚本
1.5.用户电子邮件
Linux下每一个用户默认都有一个电子邮箱账号。电子邮箱保存在/var/spool/mail子目录中,以用户名命名的文件制定
例:
[[email protected] ~]# id freeit_gyh uid=1000(freeit_gyh) gid=1000(freeit_gyh) groups=1000(freeit_gyh) [[email protected] ~]# ls /var/spool/mail/ freeit_gyh rpc |
2.用户管理
2.1.用户配置文件
- /etc/passwd
用户配置文件
[[email protected] ~]# ll /etc/passwd -rw-r--r--. 1 root root 1926 Dec 11 22:59 /etc/passwd [[email protected] ~]# head /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 |
说明:
文件内容从左到右依次为:用户名、密码、UID、GID、描述说明、用户主目录、shell(默认为/bin/bash)
- /etc/shadow
用户密码文件
[[email protected] ~]# ll /etc/shadow ----------. 1 root root 1141 Dec 11 22:59 /etc/shadow [[email protected] ~]# head /etc/shadow root:$6$DcnwECzSOErax9TE$b0NLl5K.t6ouyQwS8Ewz8sn4Y9yQTYne7dodqlhpiNn2PCapPsvZG1s/XisrG.yxbgeWmn.xnKqsZ1S1.Q2.r/:16415:0:99999:7::: bin:*:16141:0:99999:7::: daemon:*:16141:0:99999:7::: adm:*:16141:0:99999:7::: lp:*:16141:0:99999:7::: sync:*:16141:0:99999:7::: shutdown:*:16141:0:99999:7::: halt:*:16141:0:99999:7::: mail:*:16141:0:99999:7::: operator:*:16141:0:99999:7::: |
说明:
文件内容从左到右依次为:
用户名
密码 : 默认MD5加密,密码前加*或!锁定账号
密码更改时间: 从1970.1.1开始算起
密码不可更改时间: 0表示可随时更改
密码失效时间: 99999表示永不失效
密码失效前警告时间: 默认7天
密码过期后的宽限时间
账号失效时间: 从1970.1.1开始计算
保留
2.2.用户操作命令
2.2.1.创建用户
命令:
Useradd [username]
参数:
-u:指定UID
-g:指定组
-G:指定附属组
-d:指定家目录
-m:自动建立用户的宿主目录
-s:指定shell环境
-c:描述说明和备注
-e:设定用户账号有效时间
-r:建立系统账号
例1:不带参数创建user1用户
[[email protected] ~]# useradd user1 [[email protected] ~]# id user1 uid=1001(user1) gid=1001(user1) groups=1001(user1) |
例2:带参数创建user2用户
[[email protected] ~]# useradd -u 1111 -G user1 -d /home/user2 -s /sbin/nologin -c gyh user2 //UID为1111、附属组为user1,shell为/sbin/nologin(不能交互式登录)、描述为gyh [[email protected] ~]# id user2 uid=1111(user2) gid=1111(user2) groups=1111(user2),1001(user1) |
注:用户私有组
- 当一个用户被创建时,与其同名的私有组会被同时创建,用户被关联到这个私有组,用户的新文件从属于这个组。
- 优点:防止用户的新文件属于一个“公众”组;
- 缺点:可能会导致用户把自己的文件都改成所有人可以访问
2.2.2.用户密码
命令:
psswd [username]
参数:
-l:锁定账户
-u:解开账户锁定状态
-d:删除使用者的密码
-S:大s,检查指定使用者的密码认证种类
-x:--maximum=DAYS:最大密码使用时间(天)
-n:--minimum=DAYS:最小密码使用时间(天)
注:
- root用户可以修改所有用户的密码
- 普通用户只能修改自己的密码
例:为user1用户更改密码
-----------------------------------------------方法一-------------------------------------------------------- [[email protected] ~]# passwd user1 Changing password for user user1. New password: //输入密码时默认不显示 BAD PASSWORD: The password is shorter than 7 characters Retype new password: passwd: all authentication tokens updated successfully. ------------------------------------------------方法二--------------------------------------------------------- [[email protected] ~]# echo "redhat" | passwd user1 --stdin Changing password for user user1. passwd: all authentication tokens updated successfully. |
2.2.3.用户属性修改
命令:
usermod [option] [username]
参数:
-c:备注,修改账户的备注文字
-d:登入目录,修改用户登陆时的目录
-e:有效期限,修改账户的有效期限
-f:缓冲天数,修改在密码过期多少天即关闭该账号
-g:修改用户所属组
-G:修改用户所属的附加组
-l:修改用户账号名称
-L:锁定用户密码,是密码无效
-s:修改用户登陆后使用的shell
-u:修改用户ID
-U:解除密码锁定
例1:修改user1用户的UID为1110,GID为1111,附属组为user2,shell环境为/sbin/nologin
[[email protected] ~]# id user1 uid=1001(user1) gid=1001(user1) groups=1001(user1) [[email protected] ~]# cat /etc/passwd |grep user1 user1:x:1001:1001::/home/user1:/bin/bash [[email protected] ~]# usermod -u 1110 -g 1111 -G user2 -s /sbin/nologin user1 [[email protected] ~]# id user1 uid=1110(user1) gid=1111(user2) groups=1111(user2) [[email protected]~]#cat /etc/passwd |grep user1 user1:x:1110:1111::/home/user1:/sbin/nologin |
例2:把用户user1改为gyh
参数:-l
格式:usermod –l newuser olduser
[[email protected] ~]# usermod -l gyh user1 [[email protected] ~]# id user1 id: user1: No such user [[email protected] ~]# id gyh uid=501(gyh) gid=501(user1) groups=501(user1) |
2.2.4.chown
修改文件所有者
例:创建aaa文件,修改其所有者为user1
[[email protected] ~]# touch aaa [[email protected] ~]# ll aaa -rw-r--r--. 1 root root 0 May 4 08:35 aaa [[email protected] ~]# chown user1 aaa [[email protected] ~]# ll aaa -rw-r--r--. 1 user1 root 0 May 4 08:35 aaa |
3.组管理
3.1.组配置文件
- /etc/group
组配置文件
[[email protected] ~]# ll /etc/group -rw-r--r--. 1 root root 871 May 3 21:12 /etc/group [[email protected] ~]# head /etc/group root:x:0: bin:x:1: daemon:x:2: sys:x:3: adm:x:4: tty:x:5: disk:x:6: lp:x:7: mem:x:8: kmem:x:9: |
说明:从左向右依次为:组名、组密码、GID、组内用户(以UID显示)
- /etc/gshadow
组密码文件
[[email protected] ~]# ll /etc/gshadow ----------. 1 root root 701 May 3 21:12 /etc/gshadow [[email protected] ~]# head /etc/gshadow root::: bin::: daemon::: sys::: adm::: tty::: disk::: lp::: mem::: kmem::: |
说明:从左向右依次为:组名、组密码、管理员账号、组内用户
3.2.组管理操作命令
- 创建组
例:创建一个组gyh
[[email protected] ~]# groupadd gyh [[email protected] ~]# tail /etc/group | grep gyh gyh:x:1112: |
参数:
-g:指定GID
-r:创建一个系统账户
- 删除组
例:删除gyh组
[[email protected] ~]# groupdel gyh [[email protected] ~]# tail /etc/group | grep gyh [[email protected] ~]# //删除之后,组配置文件中没有这个组 |
- 设置组密码
例:创建一个freeit组,并为这个组设置一个密码,最后把用户加入到组验证
[[email protected] ~]# groupadd freeit [[email protected] ~]# gpasswd freeit Changing the password for group freeit New Password: Re-enter new password: [[email protected] freeit ~]# [[email protected] freeit ~]# su user1 [[email protected] freeit root]$ newgrp freeit Password: //如上,组设置密码之后,用户想要加入到这个组,必须要有这个组的组密码方能加入,这样也就保证了组的安全性、专用性 |
- 修改组属性
例:修改组freeit的GID
[[email protected] freeit ~]# tail /etc/group |grep freeit freeit:x:1112: //修改之前为1112 [[email protected] freeit ~]# groupmod -g 2222 freeit [[email protected] freeit ~]# tail /etc/group |grep freeit freeit:x:2222: //修改之后变为2222 |
参数:
-g:修改GID
-o:允许重复
-p:更改组的密码
- chgrp
修改文件所属组信息
例:在root用户下创建一个文件abc,更改其所属组为freeit
[[email protected] freeit ~]# touch abc [[email protected] freeit ~]# ll abc -rw-r--r--. 1 root root 0 May 4 08:27 abc [[email protected] freeit ~]# chgrp freeit abc [[email protected] freeit ~]# ll abc -rw-r--r--. 1 root freeit 0 May 4 08:27 abc |
4.特殊权限
4.1.SUID
当一个二进制文件(即命令)上应用了SUID后,任何人在执行该命令时,临时拥有命令拥有人的权限,只能应用在可执行文件上。
例1:创建用户user1,登录此用户,并在/tmp/test下使用mkdir命令创建目录gyh
[[email protected] freeit tmp]# mkdir test [[email protected] freeit tmp]# ll total 0 drwxr-xr-x. 2 root root 6 May 4 08:50 test //文件拥有者有rwx的权限 [[email protected] freeit tmp]# su user1 [[email protected] freeit tmp]$ cd test/ [[email protected] freeit test]# ll /tmp total 0 drwxr-xr-x. 3 root root 16 May 4 08:53 test [[email protected] freeit test]$ mkdir gyh mkdir: cannot create directory ‘gyh’: Permission denied //如上,没有创建的权限 |
例2:为mkdir赋予s权限,再次以同样方式创建
[[email protected] freeit ~]# whereis mkdir mkdir: /usr/bin/mkdir /usr/share/man/man1/mkdir.1.gz /usr/share/man/man1p/mkdir.1p.gz /usr/share/man/man2/mkdir.2.gz /usr/share/man/man3p/mkdir.3p.gz //查看二进制文件的位置 [[email protected] freeit ~]# ll /usr/bin/mkdir -rwxr-xr-x. 1 root root 79712 Jan 25 2014 /usr/bin/mkdir //查看二进制文件的权限,是可执行文件 [[email protected] freeit ~]# chmod u+s /usr/bin/mkdir [[email protected] freeit ~]# ll /usr/bin/mkdir -rwsr-xr-x. 1 root root 79712 Jan 25 2014 /usr/bin/mkdir [[email protected] freeit test]# su user1 [[email protected] freeit test]$ pwd /tmp/test [[email protected] freeit test]$ mkdir gyh [[email protected] freeit test]$ ls gyh [[email protected] freeit test]$ ll total 0 drwxrwxr-x. 2 root user1 6 May 4 08:53 gyh //创建成功 |
说明:
当未给mkdir这个二进制文件s权限前,文件只有所有者root有rwx权限,其他用户只有rx权限,不能在没有w权限的文件(/tmp/test对于其他用户没有w权限)下使用此命令创建目录。当给二进制文件s权限后,使用此命令的用户就临时拥有了root的权限,所以user1后来就可以在/tmp/test下创建目录。
4.2.SGID
当在一个二进制文件上应用了SGID后,任何人在执行此命令时临时拥有文件所属组的权限,同样也只能用在可执行文件上。如果在一个目录上应用了Sgid,那么任何人在该目录下创建的文件/目录的所属组会继承该目录的组
实验一:
例1:去除上个实验/usr/bin/mkdir的SUID权限,修改此文件的所属组权限为775,
[[email protected] freeit test]# chmod u-s /usr/bin/mkdir [[email protected] freeit test]# ll /usr/bin/mkdir -rwxr-xr-x. 1 root root 79712 Jan 25 2014 /usr/bin/mkdir [[email protected] freeit test]# chmod 775 /usr/bin/mkdir [[email protected] freeit test]# ll /usr/bin/mkdir -rwxrwxr-x. 1 root root 79712 Jan 25 2014 /usr/bin/mkdir //此时,文件所属组内的用户也能执行w权限,即在所属组为同一个组,并且具有rwx权限的目录下创建目录 |
例2:给test所属组rwx权限、/usr/bin/mkdir SGID权限,cd到/tmp/test目录下,切换到user1用户继续创建
[[email protected] freeit test]# chmod 775 /tmp/test/ [[email protected] freeit test]# ll /tmp/ total 0 drwxrwxr-x. 2 root root 6 May 4 09:03 test [[email protected] freeit test]# chmod g+s /usr/bin/mkdir [[email protected] freeit test]# ll /usr/bin/mkdir -rwxrwsr-x. 1 root root 79712 Jan 25 2014 /usr/bin/mkdir [[email protected] freeit test]# su user1 [[email protected] freeit test]$ pwd /tmp/test [[email protected] freeit test]$ mkdir gyh [[email protected] freeit test]$ ll total 0 drwxrwxr-x. 2 user1 root 6 May 4 09:17 gyh //创建成功 |
说明:
给/usr/bin/mkdir&/tmp/test所属组root rwx权限前,我们是不能在/tmp/test下使用命令mkdir创建目录的。要同时赋予/usr/bin/mkdir以SGID权限方能创建成功。始初,由于其他用户没有在/tmp/test 下创建目录的权限,所以不能创建gyh目录。赋予SGID之后,user1使用mkdir命令,临时拥有了命令所属组的权限,在/tmp/test下具有rwx权限,所以能够创建成功。
实验二:
例1:删除上个实验所做的操作,创建user2用户,给/usr/bin/mkdir SUID权限。User1在/tmp下创建test目录,切换到user2,并在test下创建目录gyh,查看此时gyh的所属组
[[email protected] freeit tmp]# useradd user2 [[email protected] freeit tmp]# chmod u+s /usr/bin/mkdir //给SUID权限,就是为后面的user2创建目录做铺垫,让user2能够在user1创建的test目录下使用mkdir命令时临时拥有root的权限。本实验验证的是文件所属组的内容,所以给SUID无影响。 [[email protected] freeit tmp]# ll /usr/bin/mkdir -rwsr-xr-x. 1 root root 79712 Jan 25 2014 /usr/bin/mkdir [[email protected] freeit tmp]# su user1 [[email protected] freeit tmp]$ pwd /tmp [[email protected] freeit tmp]$ mkdir test [[email protected] freeit tmp]$ ll total 0 drwxrwxr-x. 2 user1 user1 6 May 4 09:44 test [[email protected] freeit tmp]# su user2 [[email protected] freeit tmp]$ cd test/ [[email protected] freeit test]$ mkdir gyh [[email protected] freeit test]$ ll total 0 drwxrwxr-x. 2 root user2 6 May 4 09:40 gyhuser1 //如上,此时其他用户在user1创建的目录test下创建的目录,文件所属组是创建者本身的组 |
例2:给目录/tmp/test SGID权限,然后user2继续在其下创建目录aaa,查看此时的所属组
[[email protected] freeit test]# chmod g+s /tmp/test/ [[email protected] freeit test]# ll /tmp/ total 0 drwxrwsr-x. 3 user1 user1 16 May 4 09:45 test [[email protected] freeit test]# su user2 [[email protected] freeit test]$ mkdir aaa [[email protected] freeit test]$ ll total 0 drwxrwsr-x. 2 root user1 6 May 4 09:50 aaa drwxrwxr-x. 2 root user2 6 May 4 09:45 gyh //如上,此时user2在目录下创建的目录的所属组继承了test的所属组 |
4.3.Sticky
如果在一个目录上应用了sticky权限,那么该目录中的文件仅文件拥有者和root能删除
例1:查看/tmp的权限,默认是O+t的,具有sticky权限。然后登陆user1&user2,分别在/tmp下创建自己的文件,然后其中一个用户删除另一个的文件。验证能否删除。然后去掉/tmp的t权限,再次验证
[[email protected] freeit tmp]# su user1 [[email protected] freeit tmp]$ mkdir user1 [[email protected] freeit tmp]$ ll total 0 drwxrwxr-x. 2 user1 user1 6 May 4 09:55 user1 [[email protected] freeit tmp]# su user2 [[email protected] freeit tmp]$ mkdir user2 [[email protected] freeit tmp]$ ll total 0 drwxrwxr-x. 2 user1 user1 6 May 4 09:55 user1 drwxrwxr-x. 2 user2 user2 6 May 4 09:55 user2 [[email protected] freeit tmp]$ rm -rf user1 rm: cannot remove ‘user1’: Operation not permitted //如上,因为/tmp具有o+t的权限,所以user2不能删除user1的文件。 ------------------------------------------去除/tmp的o+t权限再次实验--------------------------------------- [[email protected] freeit tmp]# chmod o-t /tmp/ [[email protected] freeit tmp]# ll / |grep tmp drwxrwxrwx. 4 root root 29 May 4 10:01 tmp [[email protected] freeit tmp]# su user2 [[email protected] freeit tmp]$ rm -rf user1 [user[email protected] freeit tmp]$ ll total 0 drwxrwxr-x. 2 user2 user2 6 May 4 09:55 user2 //去除/tmp的o+t权限后,user2成功删除user1的文件 |
注:
- 前面我们说过,root为超级管理员,不论有没有权限都能执行操作,所以此处就不再验证root。