一、用户身份与用户组记录的文件
在Linux系统当中,默认情况下所有的系统上的账号信息都记录在/etc/passwd这个文件内(包括root用户)。而个人密码记录在/etc/shadow这个文件内。所有Linux的组名都记录在/etc/group内。这三个文件非常重要,不要轻易做变动。在后续内容中,我们还会详细做介绍
综上,用户身份与用户组的概念,能够帮助我们的Linux多任务环境变得更为容易管理
实现用户账号的管理,要完成的工作主要有如下几个方面:
- 用户账号的添加、删除与修改(以及更改用户所属用户组)。
- 用户口令的管理。
- 用户组的添加、删除管理。
1.用户管理—添加用户组
·用户账号的管理工作主要包括用户用户账号的添加、修改和删除
·添加用户账号就是在系统中创建一个新的账号,然后新账号分配用户号、用户组、主目录和登陆shell等资源,刚添加的账号是锁定的,无法直接登陆。
·命令:useradd 【选项】用户名
参数说明:
选项:
-c comment 指定一段注释性描述
-d 目录 指定用户主目录,如果目录不存在,则同时使用 -m选项,可以创建主目录。
-g 用户组 指定用户所属的用户组。
-G 用户组,指定用户所属的附加组。
-s Shell文件 指定用户的登录Shell。
-u 用户号 指定用户的用户号
- 创建用户
#useradd tom
- 查看用户信息
#id tom ->显示UID/GID以及tom还属于哪些组
[root@localhost ~]# useradd tom
[root@localhost ~]# id tom
uid=500(tom) gid=500(tom) groups=500(tom)
- 创建用户,指定其UID为800
[root@localhost ~]# useradd -u 800 jerry
[root@localhost ~]# id jerry
uid=800(jerry) gid=800(jerry) groups=800(jerry)
- 添加用户lucy,并设置他的个人主目录练习
# useradd –d /usr/lucy -m lucy
此命令创建了一个用户lucy,其中-d和-m选项用来为登录名lucy产生一个主目录/usr/lucy(/home为默认的用户主目录所在的父目录)。
- 创建用户gm,指定他属于主用户组“jerry”,附加组“adm、root”,登录使用的shell是/bin/sh
[root@localhost ~]# useradd -s /bin/sh -g jerry -G adm,root gm
[root@localhost ~]# id gm
uid=801(gm) gid=800(jerry) groups=800(jerry),0(root),4(adm)
此命令新建了一个用户gm,该用户的登录Shell是 /bin/sh,它属于jerry用户组,同时又属于adm和root用户组,其中jerry用户组是其主组。
- 创建用户(伪用户),没有可登陆的shell (没有可登录的shell意味着什么?)
[root@localhost ~]# useradd -s /sbin/nologin alice
[root@localhost ~]# su -tom
[tom@localhost ~]$ exit
[root@localhost ~]# su -alice
This account is currently not available.
- 增加用户账号就是在/etc/passwd文件中为新用户增加一条记录,同时更新其他系统文件如/etc/shadow, /etc/group等
2.用户管理—修改用户
- 修改用户账号就是根据实际情况更改用户的有关属性,如用户号、主目录、用户组、登录Shell等。
- 修改已有用户的信息使用usermod命令,其格式如下:
- usermod [选项] 用户名
- 常用的选项包括-c, -d, -m, -g, -G, -s, -u等,这些选项的意义与useradd命令中的选项一样,可以为用户指定新的资源值。
- 另外,这个选项指定一个新的账号,即将原来的用户名改为新的用户名。
- usermod -l newUserName oldUserName # 英文的小写L
usermod -l newUserName -d /home/newUserName -m oldUserName
练习:shell修改为bash,用户组(主组)改为root,将用户gm登陆
[root@localhost ~]# usermod -s /bin/bash -g root gm
然后通过 id gm命令查看用户组是否成功修改为root
通过查看etc/passwd文件内容gm的登陆shell是否修改为/bin/bash
3.用户口令的管理
用户管理的一项重要内容就是用户口令的管理。用户刚创建的时候没有口令,但是被系统锁定,无法使用,必须为其制定口令后才可以使用,即使是制定空的口令。
指定和修改用户口令的Shell命令是passwd。超级用户可以为自己和其他用户指定口令,普通用户只能用它修改自己的口令。命令的格式为:
passwd [选项] 用户名
可使用的选项:
• -l(lock) 锁定口令,即禁用账号。
• -u(unlock) 口令解锁。
• -d(HOME_DIR) 使账号无口令(删除密码)。(此命令仅管理员有效)
4.修改密码
#passwd ->修改自己的密码(普通用户修改比较麻烦,)
#passwd tom->修改tom的密码(管理员才可以修改其他人的密码)不需要使用高强度密码
要使用高强度密码
注:高强度密码不是够长就行!!!
5.切换用户 (有可能会被作为面试题)
#su - 目标用户 管理员切用户不需要密码,用户切管理员需要输入自己的密码
#在CentOS中(其他版本的Linux未测试)普通用户切换root用户只需要输入 su 回车后输入root密码即可切换到root用户的身份。
6.用户管理—删除用户
- 删除用户
#userdel 用户名 删除指定的用户
[root@localhost ~]# userdel alice
[root@localhost ~]# ls /home/
alice demo ds jerry mengxb tom zs
[root@localhost ~]# rm -rf /home/alice/
[root@localhost ~]# ls /home/
demo ds jerry mengxb tom zs
#userdel -r 用户名 在删除指定用户的同时删除他的home目录(工作中不建议使用,一个用户离职后,用户可以删掉,但是他的工作文件很可能还有用)
7.用户组管理
每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。不同Linux 系统对用户组的规定有所不同,如Linux下的用户属于与它同名的用户组,这个用户组在创建用户时同时创建。
用户组的管理涉及用户组的添加、删除和修改,实际上就是对/etc/group文件的更新。
用户组管理—添加
- 其格式如下:
- groupadd [选项] 用户组
- 可以使用的选项有:
-g GID 指定新用户组的组标识号(GID)。
-o 一般与-g选项同时使用,表示新用户组的GID可以与系统已有用户组的GID相同。
- 主组、附件组
- 添加用户组emp
#groupadd emp
- 添加用户组market,并指定标识号为8000
#groupadd –g 8000 market
- 将用户添加到附加组
#usermod –aG market tom (a:append G:附加组)
- 创建一个用户组与root用户组GID
- # groupadd –g 0 –o testroot
用户组管理—删除
- 从系统中删除组group1
- 如果删除的用户组,已经被用户追加为附件组,对应的所有用户的该附件组会被撤销掉。
- # groupdel group1
- 如果被删除的用户组,已经被用户指定为主组,则该用户组无法被删除。(可以理解为像Windows中文件被占用时不能被删除。)
用户组管理—修改
- 其语法如下:
- groupmod [选项] 用户组
- 常用的选项有:
-g GID 为用户组指定新的组标识号。
-o 与-g选项同时使用,用户组的新GID可以与系统已有用户组的GID相同。
-n 新用户组名 将用户组的名字改为新名字
(改名格式,groupmod –n newGroupName oldGroupName)
- 练习1:将组group2的组标识号修改为102
# groupmod -g 102 group2
- 练习2:将组group2的标识号改为10000,组名修改为group3
# groupmod –g 10000 -n group3 group2
用户组管理—当前用户切换用户组
- 如果一个用户同时属于多个用户组,那么用户可以在用户组之间切换,以便具有其他用户组的权限。
- 用户可以在登录后,使用命令newgrp切换到其他用户组,这个命令的参数就是目的用户组。例如:
- $ newgrp root
- 这条命令将当前用户切换到root用户组,前提条件是root用户组确实是该用户的主组或附加组
- 此时直接输入id后可直接查看到用户的当前组已被切换(但注意这里成为组内成员并不代表拥有了root权限,想像一下你的情书是否愿意让组员查看。)
- [mengxb@CentOS ~]$ id
- uid=500(mengxb) gid=0(root) 组=500(mengxb),0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
8.用户账号有关的系统文件详细介绍
- [root@localhost ~]# cat /etc/passwd
gm:x:802:0::/home/z:/bin/bash
tom:x:803:803::/home/tom:/bin/bash
- /etc/passwd中一行记录对应着一个用户,每行记录又被冒号(:)分隔为7个字段,其格式和具体含义如下:
- 用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell
- 1、"用户名"是代表用户账号的字符串。
通常长度不超过8个字符,并且由大小写字母或数字组成。登录名中不能有冒号(:),因为冒号在这里是分隔符。
为了兼容起见,登录名中最好不要包含点字符(.),并且不使用连字符(-)和加号(+)打头。
- 2、“口令”一些系统中,存放着加密后的用户口令。
虽然这个字段存放的只是用户口令的加密串,不是明文,但是由于/etc/passwd文件对所有用户都可读,所以这仍是一个安全隐患。因此,现在许多Linux 系统(如SVR4)都使用了shadow技术,把真正的加密后的用户口令字存放到/etc/shadow文件中,而在/etc/passwd文件的口令字段中只存放一个特殊的字符,例如“x”或者“*”。
- 3、“用户标识号”是一个整数,系统内部用它来标识用户。
一般情况下它与用户名是一 一对应的。如果几个用户名对应的用户标识号是一样的,系统内部将把它们视为同一个用户,但是它们可以有不同的口令、不同的主目录以及不同的登录 Shell等。
通常用户标识号的取值范围是0~65535。0是超级用户root的标识号,1~499由系统保留,作为管理账号,普通用户的标识号从500开始。在Linux系统中,这个界限是65535。
- 4、“组标识号”字段记录的是用户所属的主用户组。
它对应着/etc/group文件中的一条记录。
- 5、“注释性描述”字段记录着用户的一些个人情况。
例如用户的真实姓名、电话、地址等,这个字段并没有什么实际的用途。在不同的Linux 系统中,这个字段的格式并没有统一。在许多Linux系统中,这个字段存放的是一段任意的注释性描述文字,用做finger命令的输出。
- 6、“主目录”,也就是用户的起始工作目录。
它是用户在登录到系统之后所处的目录。在大多数系统中,各用户的主目录都被组织在同一个特定的目录下,而用户主目录的名称就是该用户的登录名。各用户对权限,其他用户对此目录的访问权限则根据具体情况设置。自己的主目录有读、写、执行(搜索)
- 7、用户登录后,要启动一个进程,负责将用户的操作传给内核,这个进程是用户登录到系统后运行的命令解释器或某个特定的程序,即Shell。
Shell是用户与Linux系统之间的接口。Linux的Shell有许多种,每种都有不同的特点。常用的有sh(Bourne Shell), csh(C Shell), ksh(Korn Shell), tcsh(TENEX/TOPS-20 type C Shell), bash(Bourne Again Shell) 等。
系统管理员可以根据系统情况和用户习惯为用户指定某个Shell。如果不指定Shell,那么系统使用sh(或bash)为默认的登录Shell,即这个字段的值为/bin/sh(或/bin/bash)。
用户的登录Shell也可以指定为某个特定的程序(此程序不是一个命令解释器)。
利用这一特点,我们可以限制用户只能运行指定的应用程序,在该应用程序运行结束后,用户就自动退出了系统。有些Linux 系统要求只有那些在系统中登记了的程序才能出现在这个字段中。
- 8、系统中有一类用户称为伪用户(psuedo users)。
- 这些用户在/etc/passwd文件中也占有一条记录,但是不能登录,因为它们的登录shell为空(或/sbin/nologin)。它们存在的原因主要是方便系统管理,满足相应的系统进程对文件属主的要求。
- 常见的伪用户如下所示:
- 伪用户名 含义
- bin 拥有可执行的用户命令文件
- sys 拥有系统文件
- adm 拥有帐户文件
- uucp UUCP使用
- lp lp或lpd 子系统使用
- nobody NFS使用
- /etc/shadow中的记录行与/etc/passwd中的一一对应,它由pwconv命令根据/etc/passwd中的数据(内容)自动产生,它的文件格式与/etc/passwd类似,由若干个字段组成,字段之间用":"隔开。这些字段是:mengxb:$1$P3i2zUCl$QxgXUAArJQhNWFxl0EFaD1:17365:0:99999:7:::
登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志
- 1."登录名"是与/etc/passwd文件中的登录名相一致的用户账号
- 2.“口令”字段存放的是加密后的用户口令字,长度为13个字符。如果为空,则对应用户没有口令,登录时不需要口令;如果含有不属于集合 { $./0-9A-Za-z }中的字符,则对应的用户不能登录。
- 3.“自创建密码时刻起,到用户最后一次修改口令时的天数。时间起点对不同的系统可能最后一次修改时间”表示的是从某个不一样。例如在SCO Linux 中,这个时间起点是1970年1月1日。(最近一次修改的日期)
- 4.“最小时间间隔”指的是两次修改口令之间所需的最小天数。(自上次修改密码后多久之内不能被修改)
- 5.“最大时间间隔”指的是口令保持有效的最大天数。(密码最久使用的时间)
- 6.“警告时间”字段表示的是从系统开始警告用户到用户密码正式失效之间的天数。(密码到期前提醒修改的时间。)
- 7.“不活动时间”表示密码失效后,但账号仍能保持有效的最大天数。(密码过期后最多几天内还能登录或着理解为密码过期后的存活期)
- 8.“失效时间”字段给出的是一个绝对的天数,如果使用了这个字段,那么就给出相应账号的生存期。期满后,该账号就不再是一个合法的账号,也就不能再用来登录了。(密码无效时间)
- 下面是/etc/shadow的部分内容:
[root@localhost ~]# cat /etc/shadow root:$1$wLLDHgEB$A6lPm6zobBrbncPDvKajb1:17206:0:99999:7:::
bin:*:15980:0:99999:7:::
daemon:*:15980:0:99999:7:::
adm:*:15980:0:99999:7:::
- 用户组的所有信息都存放在/etc/group文件中。
- 将用户分组是Linux 系统中对用户进行管理及控制访问权限的一种手段。
- 每个用户都属于某个用户组;一个组中可以有多个用户,一个用户也可以属于不同的组。
- 当一个用户同时是多个组中的成员时,在/etc/passwd文件中记录的是用户所属的主组,也就是登录时所属的默认组,而其他组称为附加组。
- 用户要访问属于附加组的文件时,必须首先使用newgrp命令使自己成为所要访问的组中的成员。 mkt:x:8888:gm
- 用户组的所有信息都存放在/etc/group文件中。此文件的格式也类似于/etc/passwd文件,由冒号(:)隔开若干个字段,这些字段有:
- 组名:口令:组标识号:组内用户列表
- 1."组名"是用户组的名称,由字母或数字构成。与/etc/passwd中的登录名一样,组名不应重复。
- 2."口令"字段存放的是用户组加密后的口令字。一般Linux 系统的用户组都没有口令,即这个字段一般为空,或者是*。
- 3."组标识号"与用户标识号类似,也是一个整数,被系统内部用来标识组。
- 4."组内用户列表"是属于这个组的所有用户的列表/b],不同用户之间用逗号(,)分隔。这个用户组可能是用户的主组,也可能是附加组。
二、权限
-rw-r--r--. 1 root root passwd
[root@localhost demo]# cp /etc/passwd .
[root@localhost demo]# ll passwd (ls –l passwd)
-rw-r--r--. 1 root root 1765 Jan 3 03:24 passwd
[root@localhost demo]# su mengxb
[mengxb@localhost demo]$ tail -2 passwd #显示后两行
jerry:x:800:800::/home/jerry:/bin/bash
liubei:x:801:801::/home/liubei:/bin/bash
[mengxb@localhost demo]$ echo 'good bye' >> passwd
bash: passwd: Permission denied
权限之—逻辑权限修改
- 权限修改需要使用的命令是:chmod
- 权限对应的数字权限:
- r = 4 (读)
- w = 2 (写)
- x = 1 (执行)
如果你看到了一个文件的权限为:- rwx r-x r-- *.txt
user group other
该文件的数字权限为:754,其含义为:用户拥有读、写、执行的权限,用户组拥有读、执行,其他人仅拥有读的权限。
权限—思考题
在工作中有的时候偶尔会发现即使是root用户也不能修改某个文件。这是怎么回事?
是因为没有给rw权限吗?
是因为文件的属主不是root?
还是该文件不属于任何人?
权限之—物理权限的修改
- chattr命令
- 此命令可以用来锁定某个文件不能被修改。系统内核2.6以上的版本支持。
- 可以通过此命令来修改文件的物理属性从而提高系统的安全性。
- 但不能修改保护/ 、 /dev 、 /tmp 、 /var目录。
- 命令用法:
chattr [ -RVf ] [ -v version ] [ mode ] files…
- 选项:
- a:让文件或目录仅供附加用途;
- i:不得任意更动文件或目录;
- s:保密性删除文件或目录;(直接删除硬盘上的数据)
- S:即时更新文件或目录;(直接存入硬盘计算机工作原理其中之一是先写入缓存,再写入硬盘)
- u:预防意外删除。(数据依然存在硬盘上,可用于数据恢复)
- -R:递归处理,将指令目录下的所有文件及子目录一并处理;
- -v<版本编号>:设置文件或目录版本;
- -V:显示指令执行过程;
- +<属性>:开启文件或目录的该项属性;
- -<属性>:关闭文件或目录的该项属性;
=<属性>:指定文件或目录的该项属性;
- 实例:
- 防止系统中的某个关键文件被修改
chattr +i /etc/fstab
- 将home目录下的文件和目录设置为不允许任何人修改
chattr -R +i /home
- 让某个文件只能追加内容,不能删除
chattr +a /root/install.log
权限之—物理权限查看
- lsattr命令列出文件的隐藏属性。其语法格式为:
lsattr [ -RVadv ] [ files… ]
- 选项:
-R 递归显示目录下所有子目录和文件的属性
-V 显示lsattr程序的版本信息
-a 显示所有文件的属性信息,包括以.开头的文件
-d 显示目录的属性,而不是目录下的文件的属性
-v 显示文件的档案号码
- 实例:
- 显示某文件隐藏的物理权限(属性):
lsattr /root/install.log
-----a-------e- /root/install.log
- 其中的a表示文件只可被追加,不能被删除。
- e是ext文件系统的属性,表示文件的存储单位是extent(区段),此属性仅作了解即可。
权限之—普通用户的root权限
工作中一般体质健全的公司通常不会允许工作人员使用root账户,这样可以保证root密码的安全。
但有些时候我们却又要用到root权限该怎么办?
- sudo命令(SuperUser Do)
- 通过修改/etc/sudoers文件使普通用户可以执行sudo命令。该命令代表着root执行。
- 好处:
使用自己配置好的用户环境
不需要知道root密码,保证root的密码安全,不用让root裸奔
避免root账户引起管理员之间的恶性冲突、流血事件
可以限制用户执行有限的root权限
sudo执行的每条命令都会被记录,便于日后的日志审计,例如用户执行过高危操作命令
- 友好的提示:
我们相信您已经收到了本地系统管理员的常规警告。通常归结为以下三点:
1:尊重他人的隐私。
2:在打字前先思考。
3:权力越大,责任越大。
- 在/etc/sudoers文件的第98行下面添加用户名,例如
admin ALL=(ALL) ALL