/etc/passwd,/etc/shadow,/etc/group,/etc/gshadow
当我们创建一个用户的时候,他的家目录下面默认会有一些隐藏文件,比如.bashrc、.bash_histoy、.bash_profile
这些文件从哪来的?
[[email protected] ~]# ls -la dr-xr-x---. 3 root root 4096 Apr 1 22:39 . dr-xr-xr-x. 25 root root 4096 Apr 1 21:51 .. -rw-------. 1 root root 20481 Apr 1 20:08 .bash_history -rw-r--r--. 1 root root 18 May 20 2009 .bash_logout -rw-r--r--. 1 root root 176 May 20 2009 .bash_profile -rw-r--r--. 1 root root 176 Sep 23 2004 .bashrc [[email protected] ~]# ls -la /etc/skel total 24 drwxr-xr-x. 3 root root 4096 Mar 3 23:26 . drwxr-xr-x. 91 root root 4096 Apr 1 21:51 .. -rw-r--r--. 1 root root 18 Jul 24 2015 .bash_logout -rw-r--r--. 1 root root 176 Jul 24 2015 .bash_profile -rw-r--r--. 1 root root 124 Jul 24 2015 .bashrc drwxr-xr-x. 2 root root 4096 Nov 12 2010 .gnome2 [[email protected] ~]#
对了,其实当我们执行useradd
命令的时候,就相当于把/etc/skel/
下的文件拷贝到了用户的家目录下。
某日用户反馈,他的账号登陆上来有如下提示,如何解决?
-bash-4.1$ -bash-4.1$ -bash-4.1$ -bash-4.1$
1.由于shell提示符是由PS1变量来提供的,查看PS1变量内容
-bash-4.1$ echo $PS1 \s-\v\$ -bash-4.1$
2.发现PS1环境变量错误,使用env后发现用户的环境变量错误,查看用户家目录下的环境变量发现没有。解决方法,把/etc/skel
目录下的环境变量复制到用户的家目录下即可。
-bash-4.1$ cp /etc/skel/.bash* ~/ -bash-4.1$ cd ~/ -bash-4.1$ ls -la drwxr-xr-x 3 stu1 stu1 4096 Apr 1 23:16 . drwxr-xr-x. 14 root root 4096 Apr 1 16:06 .. -rw------- 1 stu1 stu1 44 Apr 1 23:09 .bash_history -rw-r--r-- 1 stu1 stu1 18 Apr 1 23:16 .bash_logout -rw-r--r-- 1 stu1 stu1 176 Apr 1 23:16 .bash_profile -rw-r--r-- 1 stu1 stu1 124 Apr 1 23:16 .bashrc drwxr-xr-x 2 root root 4096 Mar 31 16:29 .gnome2
重新登陆后,正常!
把一些说明性的文件,放在该目录下,创建用户的时候会直接复制到用户的家目录初始化用户的环境变量(可以把环境变量写入到/etc/skel/.bash_profile
中。这样再创建用户后,就会统一使用该环境变量,达到初始化的目的
/etc/login.defs
当我们创建用户时,用户默认的UID为500以上,默认会创建用户的邮箱文件/var/spool/mail
,那么这些信息是由谁来定义的呢。
[[email protected] etc]# grep "^[^#]" login.defs MAIL_DIR /var/spool/mail #创建用户是,在/var/spool/mail下创建邮件目录 PASS_MAX_DAYS 99999 #创建用户的默认密码最大有效期 PASS_MIN_DAYS 0 #两次修改密码的最小间隔时间 PASS_MIN_LEN 5 #密码的最小长度 PASS_WARN_AGE 7 #密码过期前的提醒时间 UID_MIN 500 #创建用户时,最小UID UID_MAX 60000 #创建用户时,最大UID GID_MIN 500 #创建用户时,最小GID GID_MAX 60000 #创建用户时,最大GID CREATE_HOME yes #同时创建用户的家目录 UMASK 077 #用户家目录的umask,(用户家目录权限700) USERGROUPS_ENAB yes #创建用户时,并创建同名用户组 ENCRYPT_METHOD SHA512 #密码使用SHA512加密 [[email protected] etc]#
/etc/defualt/useradd
当我们创建用户的时候,为什么会去/etc/skel
下复制变量文件?为什么会在home下创建用户的家目录?为什么会指定用户的shell为/bin/bash
?
[[email protected] default]# cat useradd # useradd defaults file GROUP=100 #创建用户时的默认组GID,如果login.defs创建同名组,则login.defs优先 HOME=/home #在home下创建用户的家目录 INACTIVE=-1 #是否使用账号过期停权,-1表示不启动 EXPIRE= #账号终止日期,不设置表示不启用 SHELL=/bin/bash #设置用户的默认shell为/bin/shell SKEL=/etc/skel #用户环境变量目录 CREATE_MAIL_SPOOL=yes #创建用户mail目录,目录在login.defs中定义 [[email protected] default]#
当我们使用命令useradd
,来创建用户的时候,它默认会按照该文件中定义的去执行,比如环境变量在/etc/skel
下,家目录路在/home
下。生产环境下一般不去修改该文件内容。
/etc/skel
:存放用户的环境变量文件。/etc/login.defs
:用来设置用户账号限制的文件。/etc/default/useradd
:创建用户的默认配置文件。用于创建Linux系统中的账户
语法格式
useradd [选项] [参数] 常用选项 -c:创建用户时,添加账户说明信息。 -d:指定用户的家目录。 -e:指定用户的终止期限,日期格式为‘mm/yy/dd’。 -g:指定用户的所属组,可以是组名,或者GID。(必须已存在) -G:指定用户的附加组,可以是组名,或者是GID。(必须已存在) -s:指定用户的shell,默认情况下系统会根据/etc/default/useradd设定用户的shell。 -u:指定用户的UID,不存在,且唯一。 -M:不创建用户家目录。(默认为-m,创建用户家目录) -n:取消建立同名的用户组名。 参数 要创建的用户名
实例
[[email protected] home]# useradd -c 'this is boy' -d /home/handsomeboy/ -e '2016/11/11' -g handsomeboy -G root -s /sbin/nologin -u 800 -M -n lixin [[email protected] home]# tail -1 /etc/passwd #用户UID,GID,描述,家目录,shell均已更改 lixin:x:800:513:this is boy:/home/handsomeboy/:/sbin/nologin [[email protected] home]# id lixin #所属组,和附加组也以更改 uid=800(lixin) gid=513(handsomeboy) groups=513(handsomeboy),0(root) [[email protected] home]# ls -l /home total 44 #没有创建同名家目录 drwxr-xr-x 2 root root 4096 Apr 2 14:32 handsomeboy drwxr-xr-x 3 stu1 stu1 4096 Apr 1 23:16 stu1 drwx------ 3 stu10 stu10 4096 Mar 30 18:13 stu10 drwx------ 3 stu2 stu2 4096 Mar 30 18:13 stu2 drwx------ 3 stu3 stu3 4096 Mar 30 18:13 stu3 drwx------ 3 stu4 stu4 4096 Mar 30 18:13 stu4 drwx------ 3 stu5 stu5 4096 Mar 30 18:13 stu5 drwx------ 3 stu6 stu6 4096 Mar 30 18:13 stu6 drwx------ 3 stu7 stu7 4096 Mar 30 18:13 stu7 drwx------ 3 stu8 stu8 4096 Mar 30 18:13 stu8 drwx------ 3 stu9 stu9 4096 Mar 30 18:13 stu9 [[email protected] home]# tail -1 /etc/group handsomeboy:x:513: #没有创建同名用户组 [[email protected] home]# chage -l lixin Last password change : Apr 02, 2016 Password expires : never Password inactive : never Account expires : Nov 11, 2016 #账号期限 Minimum number of days between password change : 0 Maximum number of days between password change : 99999 Number of days of warning before password expires : 7 [[email protected] home] 4.1.1 /etc/passwd文件 # 当我们创建一个用户之后,它会把用户的信息存放在/etc/passwd文件中,如图:
各字段含义:
小结:
/etc/login.defs
文件中定义的范围是500-60000/etc/shadow
文件中,这里用x表示/etc/shells
文件中/etc/passwd、/etc/shadown、/etc/group、/etc/gshadow
四个文件用户创建Linux系统中的用户组
语法格式 groupadd [选项] [参数] 常用选项 -g:指定用户的GID,不存在,且唯一。 参数 要创建的用户组的组名
实例
[[email protected] home]# groupadd -g 1000 xiaoming [[email protected] home]# tail -1 /etc/group xiaoming:x:1000: [[email protected] home]#
当我们创建一个用户组之后,Linux会把组相关信息存放在/etc/group文件中,如图:
各字段含义:
小结:
删除Linux系统中的用户组,前提该用户组中没有成员。
语法格式 groupdel [参数] 参数 要删除的用户组的组名
实例
[[email protected] home]# groupdel xiaoming #删除用户组 groupdel: cannot remove the primary group of user 'lixin' #提示该组下存在用户lixin [[email protected] home]# userdel -r lixin #删除用户lixin [[email protected] home]# groupdel xiaoming #成功删除xiaoming用户组 [[email protected] home]#
修改Linux系统中的用户密码,以及密码相关信息,root用户可以修改任何人密码,普通用户只能修改自己的密码。
语法格式 passwd [选项] [参数] 常用选项 --stdin:接受标准输入作为用户的密码(非交互式修改密码)。 -d:删除用户密码,仅管理员有权限执行。 -l:锁住密码 -u:解开上锁的账户 参数 要修改信息的账户名,省略表示修改当前用户
实例
[[email protected] ~]# useradd lixin #使用123456,为用户lixin的密码 [[email protected] ~]# echo '123456' | passwd --stdin lixin Changing password for user lixin. passwd: all authentication tokens updated successfully. [[email protected] ~]# #此方法多用户脚本中
用来修改用户密码到期相关信息
语法格式 chage [选项] 用户名 常用选项 -m:密码可更改的最小天数。为零时代表任何时候都可以更改密码 -M:密码保持有效的最大天数。 -w:用户密码到期前,提前收到警告信息的天数。 -E:帐号到期的日期。过了这天,此帐号将不可用。 -I:停滞时期。如果一个密码已过期这些天,那么此帐号将不可用。 -L(小写):例出当前的设置。
实例
查看当前用户密码信息
[[email protected] ~]# chage -l root Last password change : Mar 03, 2016 Password expires : never Password inactive : never Account expires : never Minimum number of days between password change : 0 Maximum number of days between password change : 99999 Number of days of warning before password expires : 7
各字段含义:
修改用户密码相关信息
[[email protected] ~]# chage -d '2020/01/01' -E '2020/02/01' -I 60 -m 7 -M 30 -W 15 stu1 [[email protected] ~]# chage -l stu1 Last password change : Jan 01, 2020 Password expires : Jan 31, 2020 Password inactive : Mar 31, 2020 Account expires : Feb 01, 2020 Minimum number of days between password change : 7 Maximum number of days between password change : 30 Number of days of warning before password expires : 15 [[email protected] ~]#
小技巧
删除Linux系统中的用户
语法格式 userdel [选项] [参数] 常用选项 -r:删除用户,同时删除用户的家目录 参数 要删除的用户名
实例
[[email protected] ~]# userdel -r lixin #删除用户,同时删除用户的家目录 [[email protected] ~]# ls -l /home total 44 drwxr-xr-x 2 root root 4096 Apr 2 14:32 handsomeboy drwxr-xr-x 3 stu1 stu1 4096 Apr 1 23:16 stu1 drwx------ 3 stu4 stu4 4096 Mar 30 18:13 stu4 drwx------ 3 stu5 stu5 4096 Mar 30 18:13 stu5 drwx------ 3 stu6 stu6 4096 Mar 30 18:13 stu6 drwx------ 3 stu7 stu7 4096 Mar 30 18:13 stu7 drwx------ 3 stu8 stu8 4096 Mar 30 18:13 stu8 drwx------ 3 stu9 stu9 4096 Mar 30 18:13 stu9 [[email protected] ~]#
小技巧
一般不能确认用户相关目录有没有重要数据就不能用-r。
vi/etc/passwd
,注释掉用户,观察一个月,这样出问题就可以恢复
把登陆shell改为/sbin/nologin
ladp(类似活动目录)帐号同意管理,库里干掉用户,全部都没了。
该命令用于修改用户的相关信息
语法格式 usermod [选项] [参数] 常用参数 -d:修改用户的家目录。 -s:修改用户的shell。 -u:修改用户的UID -g:修改用户的所属组 -G:修改用户的附加组 -c:修改用户的描述信息。 -e:修改用户的过期时间。
实例
[[email protected] ~]# tail -1 /etc/passwd stu10:x:510:510::/home/stu10:/bin/bash [[email protected] ~]# usermod -u 1000 -d /tmp -c 'i am boy' -g root -s /sbin/nologin stu10 [[email protected] ~]# tail -1 /etc/passwd stu10:x:1000:0:i am boy:/tmp:/sbin/nologin [[email protected] ~]#
用来切换当前用户到其他用户
语法格式 su [选项] [参数] 常用选项 -:表示切换用户,同时切换用户的环境变量。 -c <command>:表示以某个用户的身份执行一条命令。 参数 要切换的用户名
实例
[[email protected] ~]# su - stu1 -c whoami #以stu1用户执行whoami命令 stu1 [[email protected] ~]#
小技巧
当我们开机需要用某个身份运行某个服务的时候
[[email protected] ~]# su - apache -c /etc/init.d/apache restart [[email protected] ~]# #该命令写入rc.local中就可以了
扩展:
切换用户身份的su命令为我们管理Linux系统带来了很多方便,通过切换到root下,可以完成各种系统管理工作,只要任何一个普通用户知道了root用户的密码,都能以普通用户的身份切换到root下来完成无法完成的系统管理的工作。
但是,这样通过su命令切换到root后,也带来了很大安全管理问题:比如系统有8个用户,都可以通过切换到root身份进行系统管理,甚至还可以改掉root密码,让其他的普通用户无法再实现系统管理,还有,这么多用户中,有任何一人对系统操作的重大失误,都可能导致整个系统崩溃或数据损失。这样的非集中权式管理,在一定程度上就对系统的安全造成了较大的威胁。在工作中几乎有一般的问题来自于内部。
所以使用su命令切换身份在多个系统管理员共同管理的场合,并不是最好的选择,我们可以用sudo命令解决该问题。
更改当前用户的属组信息,类似于su,su是切换当前用户到目标用户,newgrp是切换当前用户组到目标用户组。
语法格式 newgrp [参数] 参数 要切换到的目标用户组的组名
实例
[[email protected] tmp]# newgrp stu01 #切换用户的属组 [[email protected] tmp]# id uid=0(root) gid=1001(stu01) groups=1001(stu01),0(root) [[email protected] tmp]# touch 12 #创建文件后发现文件的属组已更改 [[email protected] tmp]# ls -l 12 -rw-r--r-- 1 root stu01 0 Apr 3 16:16 12 [[email protected] tmp]#
普通用户必须知道root密码才可以切换到root,这样root密码就泄露了。相当于把“枪”交给了别人。
使用su命令切换身份,无法对切换后的身份做精细的控制,拿到超级权限的人可以为所欲为。甚至可以改掉root密码,让真正的管理员无法拥有root权限。
通过sudo命令,我们可以把某些超级用户权限分类有针对性的授权给指定用户,并且普通用户不需要知道root密码就可以使用得到的授权(管理员真正允许的root权限)。因此sudo命令比su命令在权限管理上来说更精细,更安全。
普通用户通过在要执行的命令前加sudo来启动sudo权限,系统首先检测/var/db/sudo/username(对应的用户名)的时间戳文件,默认是5分钟,若过期则需要输入当前用户的密码,若没有过期则直接进入/etc/visudo文件中,查找该用户是否被sudo授权了该命令,若授权,则返回结果后退出sudo权限,若没有授权,则直接退出sudo权限。
如下图:
/etc/sudoers
该文件主要定义用户权限的语法是:
各字段含义:
NOPASSWD
:,也可以用/bin/*表示/bin下的所有命令) 用visudo命令直接对/etc/sudoers
文件进行编辑,效果等同于vi /etc/sudoers
,但是visudo默认带语法检查,如果我们使用vi /etc/sudoers
对文件进行编辑的时候,需要使用visudo –c 来检查该文件的正确性。
编辑sudo配置文件
语法格式 visudo [选项] 常用选项 -c:检查/etc/sudoers文件的语法是否正确
实例
[[email protected] etc]# visudo -c /etc/sudoers: parsed OK [[email protected] etc]#
使用其他用户执行命令
语法格式 sudo [选项] [参数] 常用选项 -l:列出当前用户可以执行的sudo权限 -k:清除用户的时间戳文件(下一次执行sudo将要输入密码) 参数 要执行的命令
实例:
[[email protected] etc]# sudo -l Matching Defaults entries for root on this host: requiretty, !visiblepw, always_set_home, env_reset, env_keep=\"COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS\", env_keep+\"MAIL PS1 secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin …… User root may run the following commands on this host: (ALL) ALL #说明我可以切换到任何用户下执行任何命令 [[email protected] etc]#
##第一部分,测试时候可以删除root用户文件 [[email protected] home]# ls -l drwxr-xr-x 2 root root 4096 Apr 2 14:32 handsomeboy [[email protected] home]$ rm -rf handsomeboy rm: cannot remove 'handsomeboy': Permission denied #被拒绝 [[email protected] home]$ sudo rm -rf handsomeboy [sudo] password for stu1: stu1 is not in the sudoers file. This incident will be reported. [[email protected] home]$ ##第二部分root用户授权stu1用户rm命令的sudo权限 [[email protected] home]# echo 'stu1 ALL=(root) /bin/rm' >> /etc/sudoers [[email protected] home]# visudo –c # 检查语法 /etc/sudoers: parsed OK [[email protected] home]# tail -1 /etc/sudoers stu1 ALL=(root) /bin/rm [[email protected] home]# ##第三部分测试stu1用户sudo 权限 [[email protected] home]$ ls -l drwxr-xr-x 2 root root 4096 Apr 2 14:32 handsomeboy [[email protected] home]$ rm -rf handsomeboy rm: cannot remove 'handsomeboy': Permission denied [[email protected] home]$ sudo rm -rf handsomeboy [sudo] password for stu1: [[email protected] home]$ ls -l [[email protected] home]$ #使用sudo权限后,删除root文件成功! 注意: 正常编写sudoers文件需要使用visudo命令进入sudoers文件中进行编写,不要使用echo 的方式追加,避免出现问题 扩展 使用别名定义多个用户多个命令集合 ##定义用户、主机、命令别名 visudo; Host_Alias LOCALHOST = lixin User_Alias TESTUSER = stu1, stu2 Cmnd_Alias NETWORK = /bin/rm TESTUSER LOCALHOST=(root) NOPASSWD: NETWORK #不需要输入密码 ##查看用户的sudo权限 [[email protected] home]# su - stu1 [[email protected] ~]$ sudo -l Matching Defaults entries for stu1 on this host: …… LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE\", env_keep+=\"LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY\", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin User stu1 may run the following commands on this host: (root) NOPASSWD: /bin/rm #stu1已经具有/bin/rm权限,并且没有输入密码 [[email protected] ~]$ [[email protected] home]# su - stu2 [[email protected] ~]$ sudo -l Matching Defaults entries for stu2 on this host: …… LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE\", env_keep+=\"LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY\", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin User stu2 may run the following commands on this host: (root) NOPASSWD: /bin/rm #stu2已经具有/bin/rm权限,并且没有输入密码 [[email protected] ~]$
小结:
用户 | 主机 | 角色 | 命令 |
---|---|---|---|
TESTUSER | LOCALHOST | root | NOPASSWD |
stu1,stu2 | lixin | /bin/rm |
默认情况下我们是无法通过ssh远程执行sudo命令的
[[email protected] home]# ssh [email protected] sudo rm -rf /home/home [email protected]\'s password: sudo: sorry, you must have a tty to run sudo #由于sudo是交互式的输入密码执行,提示需[[email protected] home]# 要一个tty(虚拟终端)来执行sudo
查看visudo配置文件后发现如下内容:
# Disable "ssh hostname sudo <cmd>", because it will show the password in clear. # You have to run "ssh -t hostname sudo <cmd>". # Defaults requiretty #原来是sudoers禁止了ssh hostname sudo<cmd>这种方式,因为可能会泄露密码,但它提示我们可以使用ssh –t hostname sudo <cmd>来执行
查看了ssh 的-t参数,表示指定一个伪终端来迫使shell以交互的模式来工作。
[[email protected] home]# ssh -t [email protected] sudo rm -rf /home/home [email protected]\'s password: Connection to 10.0.0.8 closed. [[email protected] home]# ls –l #删除成功
通过配置sudo
的审计功能,来查看用户使用sudo
权限都进行了哪些操作
配置日志审计功能:
# 1.确认sudo 和rsyslog这两个包是否存在 [[email protected] home]# rpm -qa sudo rsyslog rsyslog-5.8.10-10.el6_6.x86_64 sudo-1.8.6p3-19.el6.x86_64 [[email protected] home]# # 2.配置/etc/sudoers [[email protected] home]# echo "Defaults logfile=/var/log/sudo.log" >>/etc/sudoers [[email protected] home]# tail -1 /etc/sudoers Defaults logfile=/var/log/sudo.log [[email protected] home]# ## 在配置文件中添加sudo日记记录(Defaults loginfile=/var/log/sudo.log) # 3.测试是否记录 ##使用stu1用户执行sudo权限 [[email protected] home]$ rm -rf stu10 rm: cannot remove 'stu10': Permission denied [[email protected] home]$ sudo rm -rf stu10 [[email protected] home]$ ls -l [[email protected] home]$ ##查看sudo日志信息,确认是否记录 [[email protected] home]# cat /var/log/sudo.log Apr 2 23:44:55 : stu1 : TTY=pts/0 ; PWD=/home/stu1 ; USER=root ; COMMAND=/bin/rm -rf test.txt Apr 2 23:45:15 : stu1 : TTY=pts/0 ; PWD=/home ; USER=root ; COMMAND=/bin/rm -rf stu10 [[email protected] home]# #已成功记录sudo日志