1.用户配置文件
文件 /etc/passwd, 输入 cat/etc/passwd来查看用户密码文件核心配置,创建的用户都会在此文件中增加一行
首先先来看一下文件结构,每个用户为一行,每一行用冒号分割为7段, 第一行为root,后面行是系统自带自己安装的用户,自己创建的用户则会在最后面依次显示
7段的详细信息如下:
1) 第一段是用户名
2)第三段和第四段表示user id 和group id
3)第二段,早期为密码,后因为不安全,现在用x代替, 密码存在另外的文件/etc/shadow
4)第五段为用户的注释信息,不太重要,经常为空
5)第六行为用户的家目录, root用户的家目录为/root/, 普通用户的家目录为/home/username/
6) 第七行为用户的shell,用户可以进行登录需要一个交互终端,常见为bin/bash/(用户可登录), /sbin/nologin(用户不可登陆)
-
/etc/shadow和用户文件一一对应,第一行同为root,后面同为依次排列的自己创建的用户,用来控制用户密码的
# cat /etc/shadow
也是用冒号分割成九段, 我们用man shadow可以查看shadow文件的具体信息的注释
1)第一段用户名
2)第二段用户密码,为加密,不可以反编译(不可以用加密密码得到明文密码),同时即使密码设置相同,加密也不同为唯一。如果为!!则为密码空;如果为*则为密码锁定不可用
注:如果想在一行中输入多个命令,可用分隔号隔开
3)第三段为天数,最后一次改密码距离1970年1月一号的天数,可以用来看出密码改动的时间
4)第四段表示要过多少天才可以更改密码
5)第五段表示密码在多少天内到期以及密码在多少天之内必须更改
6)第六段表示在密码过期提前多少天提醒用户密码到期
7)第七段表示在密码过期多少天后账户失效被锁定,账号的失效期限
8)第八段表示账号的生命周期,在1970年一月一号之后多少天内账号失效被锁定
9)第九段为保留文件,没有实际意义
2. 用户组管理
1)用#cat查看组文件 # cat /etc/group,文件内容和用户文件/etc/passwd没有完全对应上
创建用户时就会同时创建出跟用户名相同的用户组
2)/etc/gshadow, 为组密码的配置文件
注:如下图带减号的文件表示系统自动备份的文件,如果不小心删除了/etc/passwd & /ect/shadow & /etc/gourp & /etc/gshadow, 我们可以copy带”-“的文件,进行恢复。虽然有时因为sync的时间问题,有些出入,但影响不大
3)#groupadd
-
可以创建用户组,语法为# groupadd 组
可以创建指定用户gid的用户组- # groupadd -g id number group name, CentoS7可以定义用户ID1000以上,1000以下为系统预留
4)# groupdel group name用来删除组,当用户组里有用户时,是不可删除用户组的。如下图所示,我们可以用# groupdel来删除grp1组,但是无法删除含有用户user1的用户组user1
3. 用户管理
1)# useradd, 来创建user2, #useradd user2, 普通用户的uid是从1000开始的,然后依次排序
2)创建普通用户时可以指定gid和uid,输入# useradd -u id no. -g group name user name,如下图所示
3)也可以指定user的家目录和shell, # useradd -u user id number -g group name -d 家目录 -s /.../... user name,
如下图,我们创建user4的时候指定了 uid -u 1006, 指定了组 by -g grp2,指定了用户家目录 by -d /home/aming111, 指定了shell by -s /sbin/nologin
4) # useradd -M user name, 可以用来创建用户但是不创建用户的家目录
如下图所示,我们用-M来制定在创建user5的时候不创建家目录,所以用ls查看/home/时就看不见user5的家目录
5)当创建用户,不指定任何参数时,user id依次自动增加;而group id则随着user id变化,与之前的gid无太大关系
6)# userdel 来删除用户以及与用户相关的信息,但是不会删除家目录-incase it will delete some important file by mistake, if adminstor considers file is useless, file can be deleted manually
But if you prefer to delete user and user home directory together, the # userdel -r user name can be used
4. Usermod-更改用户属性
1)# usermod 可以更改用户的user id(-u)、group id/group name (-g)、家目录 (-d)、shell(-s)
2)# useradd -G可以创建扩展组, 用# id user name可以查看出用户的uid/gid/组(所属组+扩展组)id。
一个用户可以属于多个组,但gid只有一个,除了gid之外其他的组叫做扩展组
# usemod -G group name user name, 可以指定用户的扩展组
# usemod -G group name user name, 可以指定用户的扩展组
注:如果用# usermod -g来指定gid时,只能指定一个组,因为gid为唯一只有一个,不可以指定多个组
5. 用户密码管理
1)#passwd
如果为root用户,更改密码可直接输入# passwd, 回车,就可以更改; 如若更改普通用户的明码,# passwd user name
注:为一个用户更改密码也可以用# passwd --stdin usernam,与# passwd相比,只需要输入一次明文密码即可,不需要二次输入确认密码
- 在以后写shell脚本中,设置用户密码可以如下
# echo xxxxx |passwd --stdin username (后者就不用再次输入新设置的密码,一条命令就可以更改用户的密码,不用交互), “|”为管道符,可以把前面命令的结果传输到后面的命令去
注:# echo的用法,# echo -e “xxxx\nxxxx”, 可以使输入的内容分行;# echo -e “xxxx\txxxx”, 可以使输入的内容分列
2)我们可以锁定一个用户的密码 # passwd -l username,例如# passwd -l aming, 再查看/etc/shadow,则可看见aming用户那一行第二段加密字符之前加了两个!!,就表示用户被锁定,无法登陆
注:用# usermod -L可以用来锁定用户密码,在/ect/shadow中用户行第二段加密字符前只有一个!, 所以加密字符前只要有!就表明密码是锁定的,用户无法登陆
3)解除密码锁定# passwd -u username,例如# passwd -u aming, 再查看/etc/shadow就可以发现加密密码前!!不见了,用户可以登录了
注:# usermod -U username, 与# usermod -L相对应的可以解锁用户密码
6. mkpasswd (make password)
生成随机密码
1)在使用# mkpasswd命令之前,安装# yum install -y expect, 安装完成之后,使用# mkpasswd可以随机生成字符串来作为密码
默认生成的密码为9位
2)我们可以通过加“-l 字符数”、“-s 特殊字符数”来指定自己需要的密码
例如我们用 # mkpasswd -l 12, 生成的密码就会含有12个字符
我们用# mkpass -s 3, 生成的密码中就含有三个特殊符号
在实际的应用,例如要生成100个用户给这一百个用户生成密码并记录,就可以用# mkpasswd 来生成随机密码
7. # su,用于切换用户
1)# su - username, 中间的“-”可以使得用户可以得到完全彻底切换包括自身的一些其他配置,如下图例子所示,当使用# su - aming时,我们通过命令#whoami 或者# id查看用户ID,可以发现这是用户被完全从root切换到了aming,这时就可以加载aming用户自己的配置文件;而当我们只输入# user aming时,我们可以发现当前目录还是root。
root用户切换到普通用户时不需要密码,但是普通用户切换到root用户或其他用户时需要密码
2)# su - -c ‘command’ username, 可以用来以指定某username的身份来执行某条命令,在执行完这个命令之后退出用户环境
如下图的例子,以aming用户的身份来执行一条命令,并不用登陆到aming用户下面去, # su - -c “touch /tmp/aming.111" aming, 用ls命令查看可以发现aming.111的所有者是aming
3) 如若某一用户没有家目录,这是用# su来转换时不能正常显示以username开头的命令行,会显示成“-bash-4.2”
如果想要正常显示,则需为用户新建一个家目录,并且把在模板目录下得/etc/skel/配置文件(.bash)copy到创建的家目录下,同时更改创建目录的所有者和所属组
如下图例子所示,因为创建user5的时候使用了# useradd -M 命令,user5的家目录没有被创建不存在,因此在切换到user5时,命令前缀显示不正常,如果想要改好需要如下步骤
- 创建user5的家目录, # mkdir /home/user5
- 此时/home/user5下面并没有配置文件,我们需要把在/etc/skel下的配置文件copy到/home/user5/下,以.bash开头的文件为隐藏的配置文件,# cp /etc/skel/.bash* /home/user5/
- 然后我们在更改/home/usr5/的所属者和所属组, # chown -R (目录下有文件,级联改动) user 5: user 5 /home/user5
- 此时再登陆就没有问题了
注: # su命令虽然便于操作可以使普通用户可以切换到root用户来实现系统管理,但也存在较大的安全风险,因为实现切换,普通用户必须知道root的密码,在现实生活中不能保证每个参与系统管理的普通用户都可以按正常流程来操作系统且 # su并没有设置普通用户权限的选项,因此# su不适合多人管理的情况,只适用于一两个人来管理的情况
8. # sudo
1)针对普通用户而言
可以是普通用户临时以指定用户的的身份来执行一条命令,通常情况下是给普通用户授权root用户的身份。相较于# su, # sudo可以有针对性的下放给权限,并且约定哪些用户使用哪些工具来完成与其相关的工作
首先# visudo, 来打开sudo的配置文件-/etc/sudoers(不建议使用#vi编辑,#visudo可以有错误提醒检测到语法错误),然后下翻,找到下图,图中的意思为允许root用户在任何地方使用任何命令
我们可以模仿 root ALL=(ALL) ALL,来编辑对普通用户使用某些命令的root身份的授权,第一个ALL指在哪里,第二个ALL指用户,第三个ALL表示所有命令。例如,我们可以写成 aming ALL=(ALL) ALL or 命令所在的绝对路径
下图的格式不对
退出保存后,会出现错误提醒,如下图,按提示继续编辑文件
注:": set nu"可以标注出内容的行数
正确的写法,命令要用绝对路径,且用逗号和空格分隔
- 然后我们用# su -,来转换到普通用户aming下,就可以使普通用户可以临时以root的身份进行之前设置命令了,这样就避免把root的密码给普通用户了同时也限制了普通用户的操作(可以限制where和哪些命令),更为安全
语法为# sudo 命令的绝对路径
我们也可以用# sudo -l 来查看可执行或禁止的命令
注: 在用visudo编辑时,可以在命令的绝对路径前加“NOPASSWD: ”, 那么在使用# sudo命令时则不需要输入普通用户的密码
注:
取消程序某类程序的执行,要在命令动作前面加上!号
例如 user5 ALL=(ALL)/usr/sbin/*,/sbin/*,!/usr/sbin/fdisk ,则表示user5用户被授权可以临时以root的身份运行/usr/sbin和/sbin下所有的程序,但fdisk 程序除外
然后再使用sudo -l查看在当前用户下可执行或禁止的命令,就可以发现/user/sbin/和/user/bin/下的命令除fdisk都可以执行
2)在visudo中还有一下用法,可以设置主机、用户、组、命令的别名 ( Host_Alias、User_Alias、Runas_Alias、Cmnd_Alias),然后在编写## Allow root to run any commands anywhere时可以使用,如例子所示,因为AMING_CMD代表了ls、mv、cat三种命令,则我们可以 aming ALL=(ALL) AMING_CMD, 来使aming用户临时以root的身份使用ls,mv, cat的命令
3)针对用户组
仍然用# visudo,进行编辑,找到 ## Allows people in a group wheel to run all commands, 基本用法跟普通用户的用法相类似,把想要以root身份临时使用命令的用户放入一个组,对组在进行编辑
4) sudo -i: 为了频繁的执行某些只有超级用户才能执行的权限,而不用每次输入密码,可以使用该命令。提示输入密码时该密码为当前账户的密码。没有时间限制。执行该命令后提示符变为“#”而不是“$”。想退回普通账户时可以执行“exit”或“logout” 。
sudo -i 直接运行sudo命令加-i参数
sudo su - 运行sudo命令给su命令提权,运行su命令。
sudo -i 运行结果 PWD=/root
sudo su 运行结果 PWD=/home/用户名(当前用户主目录)
扩展:
https://opensource.apple.com/source/sudo/sudo-16/sudo/sample.sudoers
http://ask.apelearn.com/question/7467
https://opensource.apple.com/source/sudo/sudo-16/sudo/sample.sudoers
http://ask.apelearn.com/question/6899
9. 限制root远程登陆
1)处于安全方面的考虑,我们需要限制root远程登录
首先我们要编辑ssh配置文件, # vi /etc/ssh/sshd_config, 进入之后用“/”来搜索关键词 Root,找到#PermitRootLogin, 去掉#同时把yes 改成no,修改完配置文件后,重启配置文件# systemctl restart sshd.service, 就可以发现我们无法远程登陆root
2)在限制了root远程登录的前提下,但有时普通用户仍需要root的权限但又不知道root用户的登陆密码,可以使用# su- & # sudo来实现登录。因为以root的身份来 # su - root是不需要密码的,所以我们可以把一些用户的sudo配置改成可以以root的身份来使用# su -的命令,从而实现不知道密码也可以登录root
然后我们就可以在普通用户的登陆下使用# sudo su - root, 来切换到了root下