Linux 用户管理

1 小知识点回顾

  • Linux 是一个多用户多任务操作系统。
  • 每个文件和进程,都需要对应一个用户和用户组。
  • Linux系统是通过UID和GID来识别用户和组的。
  • 用户名相当于人名(给人看的),UID,GID相当于身份证号(系统用的)
  • Linux管理员:root
  • 用户和组的关系:1对1、1对多、多对1、多对多
  • Linux系统用户的分类:
    • 超级用户:UID为0,代表皇帝。
    • 普通用户:UID为500-65535,由皇帝创建的普通用户,大臣。
    • 虚拟用户:UID为1-499,,为了满足程序启动的需要。
  • 和用户关联的四个文件:/etc/passwd,/etc/shadow,/etc/group,/etc/gshadow

2 环境变量配置文件 /etc/skel

        当我们创建一个用户的时候,他的家目录下面默认会有一些隐藏文件,比如.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/下的文件拷贝到了用户的家目录下。

2.1 异常例子

某日用户反馈,他的账号登陆上来有如下提示,如何解决?

-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

重新登陆后,正常!

2.2. 小技巧

        把一些说明性的文件,放在该目录下,创建用户的时候会直接复制到用户的家目录初始化用户的环境变量(可以把环境变量写入到/etc/skel/.bash_profile中。这样再创建用户后,就会统一使用该环境变量,达到初始化的目的

3 用户配置信息文件

3.1 设置用户账号限制的文件

/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]#

3.2 创建用户的默认配置文件

/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下。生产环境下一般不去修改该文件内容。

3.3 小结

  • /etc/skel:存放用户的环境变量文件。
  • /etc/login.defs:用来设置用户账号限制的文件。
  • /etc/default/useradd:创建用户的默认配置文件。

4 用户管理相关命令

4.1 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文件中,如图:

各字段含义:

  • 第一段:表示用户的名称
  • 第二段:表示用户的密码
  • 第三段:表示用户的UID
  • 第四段:表示用户的GID
  • 第五段:表示用户的描述信息
  • 第六段:表示用户的家目录
  • 第七段:表示用户的shell信息

小结:

  • a) 用户UID范围是0-65535,root用户的UID为0,1-499表示虚拟用户的UID,500-65535表示普通用户的UID,默认在/etc/login.defs文件中定义的范围是500-60000
  • b) 用户的密码信息,已经被定义到了/etc/shadow文件中,这里用x表示
  • c) 指定的家目录必须是已存在的
  • d) 系统支持的shell有:sh、bash、nologin、dash、tcsh、csh存放在/etc/shells文件中
  • e) 当我们创建用户时,系统会同时更改/etc/passwd、/etc/shadown、/etc/group、/etc/gshadow四个文件

4.2 groupadd

用户创建Linux系统中的用户组

语法格式
groupadd [选项] [参数]

常用选项
-g:指定用户的GID,不存在,且唯一。

参数
要创建的用户组的组名

实例

[[email protected] home]# groupadd -g 1000 xiaoming
[[email protected] home]# tail -1 /etc/group
xiaoming:x:1000:
[[email protected] home]#

4.2.1 /etc/group文件

当我们创建一个用户组之后,Linux会把组相关信息存放在/etc/group文件中,如图:
各字段含义:

  • 第一段:表示用户组的名称
  • 第二段:表示用户组的密码
  • 第三段:表示用户组的GID
  • 第四段:表示用户组内的成员

小结:

  • a) 用户组密码存放位置已经改为/etc/gshadow,这里用x表示,用户组密码现在已经很少使用。
  • b) 用户组的ID,范围是0-65535,其中0是root的用户组,1-499是虚拟用户对应的用户组,500-65535,才是普通用户对应的用户组,默认在/etc/login.defs中定义了范围是500-60000。
  • c) 当组中只存在和组同名的用户名时,组内成员这一列可以省略。
  • d) 当我们创建用户组的时候会更改/etc/group、/etc/gshadow文件。

4.3 groupdel

删除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]#

4.4 passwd

修改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] ~]# #此方法多用户脚本中

4.5 chage

用来修改用户密码到期相关信息

语法格式
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

各字段含义:

  • Last password change:最后一次修改密码的时间
  • Password expires:密码过期时间
  • Password inactive:密码禁用时间
  • Account expires:账号停用时间
  • Minimum number of days between password change:最小修改密码时间
  • Maximum number of days between password change:最大修改密码时间
  • Number of days of warning before password expires:密码过期前多久开始提醒

修改用户密码相关信息

[[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] ~]#

小技巧

  • 使用passwd和chage等均可以设置或更改指定帐户密码的安全信息,我们也可以通过/etc/login.defs配置文件或/etc/defaule/useradd针对所有帐户全局生效。
  • 设置用户密码的时效有利有弊:优点是可以防止运维人员离职一段时间后发现用户还可以登陆(也可能不是自己的用户),如果设置了帐户有效期,即使用户未被清理,那么一段时间内也会因为密码失效而被自动锁定。密码时效还可以强制系统管理人员定期修改密码,提示系统安全性。缺点是有一些本来应该保留的用户也因为过期而无法登陆了,另外,在服务器数量很多的情况下唉,更改密码也是很大的工作量。在大规模的运维环境中,使用LDAP(微软活动目录)对Linux帐户统一认证,批量管理,也是不错的方法。

4.6 userdel

删除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(类似活动目录)帐号同意管理,库里干掉用户,全部都没了。

4.7 usermod

该命令用于修改用户的相关信息

语法格式
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] ~]#

4.8 su

用来切换当前用户到其他用户

语法格式
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命令解决该问题。

4.9 newgrp

更改当前用户的属组信息,类似于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]#

5 sudu命令详解

        普通用户必须知道root密码才可以切换到root,这样root密码就泄露了。相当于把“枪”交给了别人。
        使用su命令切换身份,无法对切换后的身份做精细的控制,拿到超级权限的人可以为所欲为。甚至可以改掉root密码,让真正的管理员无法拥有root权限。
        通过sudo命令,我们可以把某些超级用户权限分类有针对性的授权给指定用户,并且普通用户不需要知道root密码就可以使用得到的授权(管理员真正允许的root权限)。因此sudo命令比su命令在权限管理上来说更精细,更安全。

5.1 sudu原理

        普通用户通过在要执行的命令前加sudo来启动sudo权限,系统首先检测/var/db/sudo/username(对应的用户名)的时间戳文件,默认是5分钟,若过期则需要输入当前用户的密码,若没有过期则直接进入/etc/visudo文件中,查找该用户是否被sudo授权了该命令,若授权,则返回结果后退出sudo权限,若没有授权,则直接退出sudo权限。
如下图:
sudo

5.2 配置文件解析

/etc/sudoers
该文件主要定义用户权限的语法是:
sudoers
各字段含义:

  • 第一段:表示可以使用sudo权限的用户或用户组或者用户集合的别名
  • 第二段:主机名(或主机别名,可以定义多个主机)=(要切换到的用户,一般是root)可以省略,默认是root。
  • 第三段:表示可以执行的权限(注意多个命令用,隔开。如果执行sudo不想输入密码可以在命令前加入NOPASSWD:,也可以用/bin/*表示/bin下的所有命令)

5.3 配置方法

        用visudo命令直接对/etc/sudoers文件进行编辑,效果等同于vi /etc/sudoers,但是visudo默认带语法检查,如果我们使用vi /etc/sudoers对文件进行编辑的时候,需要使用visudo –c 来检查该文件的正确性。

5.3.1 visudo

编辑sudo配置文件

语法格式
visudo [选项]

常用选项
-c:检查/etc/sudoers文件的语法是否正确

实例

[[email protected] etc]# visudo -c
/etc/sudoers: parsed OK
[[email protected] etc]#

5.3.2 sudo

使用其他用户执行命令

语法格式
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]#

5.4实例

  1. 使stu1用户可以使用rm命令删除属于root的文件
##第一部分,测试时候可以删除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

5.5注意事项

  • 授权规则中的所有ALL字符串必须为大写字母。
  • 允许执行的命令是有顺序的。命令的顺序是从后向前的,编写的时候要把禁止的命令放在允许的命令的后面。
  • 一行内容超长可以用“\”斜线表示换行。
  • '!'叹号表示非,就是命令取反的意思,既禁止使用的命令。(例如/bin/*, !/bin/rm 允许使用/bin下所有命令,但不允许使用rm命令)

5.6远程执行sudo命令

默认情况下我们是无法通过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 #删除成功

5.7sudo审计功能

通过配置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日志