1 sudo与visudo
1.1 基本说明
使用
su
命令切换用户身份虽然简单,但是,也有一些致命的缺点:
(1)
普通用户必须知道
root
密码才可以切换到
root
,这样
root
密码就泄漏了。
(2)
使用
su
命令切换身份,无法对切换后的身份做精细的控制,拿到超级权限的人可以为所欲为。甚至可以改掉
root
密码,让真正的管理员无法再拥有
root
权限。
通过
sudo
命令,我们可以把某些超级用户权限,分类有针对性授权给指定的普通用户,并且普通用户不需要知道
root
密码就可以使用得到的授权来管理。因此,
sudo
命令使得集权式管理在理论上得到了保证,使系统的安全性方面加强了很多。
1.1.1 区别
sudo
:可以让普通用户拥有
root
权限去执行命令,
sudo
的配置文件是
/etc/sudoers
。
visudo
:通过
visudo
编辑
/etc/sudoers
,可以检查语法。
1.1.2 参数说明
-l:查看授权情况,列出用户在主机上可用的和被禁止的命令
※
-k:删除时间戳,
时间戳默认5分钟
也会失效
-u:指定某个用户身份去执行特定的命令操作
-c:检查语法
※
1.1.3 sudo提权配置说明
用户或组
|
机器
=
(授权角色)
|
可以执行的命令
|
user
|
MACHINE=
|
COMMANDS
|
oldboy
|
ALL=(ALL)
|
/usr/sbin/useradd,/usr/sbin/userdel
|
%
用户组
|
|
|
1.1.4 配置oldboy用户拥有所有权限
[root@s1 ~]# visudo
#<==
通过
visudo
编辑
/etc/sudoers
oldboy ALL=(ALL) NOPASSWD: ALL
#<==
先切换到
98
行,再添加
[root@s1 ~]# su - oldboy
#<==
切换到
oldboy
用户
[oldboy@s1 ~]$ sudo su -
#<==
可以直接切换到
root
,不需要密码
[root@s1 ~]#
1.2 快速操作命令增加sudo授权
※
\cp /etc/sudoers{,.ori}
echo "oldboy ALL=(ALL) NOPASSWD:ALL">>/etc/sudoers
tail -1 /etc/sudoers
visudo -c
#<==
用
echo
追加时,最好要检查语法
1.3 sudo配置文件详解
oldboy ALL=(ALL) NOPASSWD: ALL
用户 主机 身份 命令
1.3.1 主机别名(Host Aliases)
一般不改,只用
ALL
。
13 # Host_Alias FILESERVERS = fs1, fs2
#<==
注意有空格
14 # Host_Alias MAILSERVERS = smtp,smtp2
1.3.2 用户别名(User Aliases)
用户别名包含了
用户
和
用户组
。
20 # User_Alias ADMINS = jsmith, mikem,
%groupname
#<==
用户组前面加百分号
1.3.3 身份别名(Runas_Alias)
即sudo允许切换到的用户身份,一般不改
Runas_Alias OP = root
1.3.4 命令别名(Command Aliases)
32 ## Services
33 # Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig
1.4 sudo配置文件实践
1.4.1 工作需求
职位
|
用户别名
|
身份别名
|
命令别名
|
开发人员
|
KF_ADMINS
|
OP1
|
KF_CMD
|
运维人员
|
YW_ADMINS
|
OP1
|
USER_CMD
,
DISK_CMD
,
NETMAG_CMD
,
CTRL_CMD
|
网络工程师
|
WL_ADMINS
|
OP2
|
NETMAG_CMD
|
1.4.2 操作过程
visudo
#<==
直接切换到最后一行,添加如下的内容,实际上修改的文件是:
/etc/sudoers
##Edit by chendianhu at 2016-07-26##
# User Aliases
User_Alias KF_ADMINS =kaifa01, kaifa02
User_Alias YW_ADMINS =oldboy, oldgirl, %sa
User_Alias WL_ADMINS =leo, maya
# Command Aliases
Cmnd_Alias KF_CMD =/bin/grep, /usr/bin/tail, /bin/cat
Cmnd_Alias USER_CMD =/usr/sbin/useradd, /usr/sbin/userdel, \
/usr/bin/passwd[A-Za-z]*, /bin/chown, /bin/chmod
Cmnd_Alias DISK_CMD=/sbin/fdisk, /sbin/parted
Cmnd_Alias NETMAG_CMD =/sbin/ifconfig, /etc/init.d/network
Cmnd_Alias CTRL_CMD =/sbin/reboot, /sbin/halt
#Runas Alias
Runas_Alias OP1 =root, oldboy
Runas_Alias OP2 = root, oldgirl
#Authorization
#root ALL=(ALL) ALL
#user host runas cmd
KF_ADMINS ALL=(OP1) KF_CMD
YW_ADMINS ALL=(OP1) USER_CMD, DISK_CMD, NETMAG_CMD, CTRL_CMD
WL_ADMINS ALL=(OP2) NETMAG_CMD
#<==
注意写法
ALL=(OP2)
,因为写错了,需要排查很久的!
1.4.3 验证过程
1.4.3.1
添加用户
useradd kaifa01
useradd kaifa02
useradd oldgirl
useradd leo
useradd maya
1.4.3.2
验证添加用户
id kaifa01
id kaifa02
id oldgirl
id leo
id maya
1.4.3.3
配置密码
echo "123456"|passwd --stdin kaifa01
echo "123456"|passwd --stdin kaifa02
echo "123456"|passwd --stdin oldgirl
echo "123456"|passwd --stdin leo
echo "123456"|passwd --stdin maya
1.4.3.4
以
oldgirl
用户为例
[root@s1 ~]# su - oldgirl
#<==
切换用户
oldgirl
[oldgirl@s1 ~]$ whoami
oldgirl
[oldgirl@s1 ~]$ sudo -l
#<==
查看该用户授权情况
[sudo] password for oldgirl:
省略……
用户 oldgirl 可以在该主机上运行以下命令:
(root, oldboy) /usr/sbin/useradd,/usr/sbin/userdel, /usr/bin/passwd [A-Za-z]*, /bin/chown, /bin/chmod, (root,
oldboy)/sbin/fdisk, /sbin/parted, (root, oldboy) /sbin/ifconfig, /etc/init.d/network,(root, oldboy) /sbin/reboot,
/sbin/halt
[oldgirl@s1 ~]$ rm -f /etc/hosts
#<==
删除命令
肯定
不允许
rm: 无法删除"/etc/hosts":权限不够
[oldgirl@s1 ~]$ useradd li
#<==
添加用户,不允许
-bash: /usr/sbin/useradd: 权限不够
[oldgirl@s1 ~]$ sudo useradd li
#<==
添加用户,允许,因为前面加了
sudo
关键字
[oldgirl@s1 ~]$ id li
uid=506(li) gid=506(li) 组=506(li)
[oldgirl@s1 ~]$ tail -1 /etc/passwd
li:x:506:506::/home/li:/bin/bash
[oldgirl@s1 ~]$ userdel li
#<==
删除用户,不允许
-bash: /usr/sbin/userdel: 权限不够
[oldgirl@s1 ~]$ sudo userdel li -r
#<==
删除用户,允许,因为前面加了
sudo
关键字
[oldgirl@s1 ~]$ id li
id: li:无此用户
1.5 注意事项
(1)
授权规则中的
ALL
字符串必须为大写字母
(2)
\
:代表换行(反斜线)
(3)
!
:代表非(感叹号)
(4)
远程
sudo
加
-t
参数
1.6 sudo审计
sudo
配合
rsyslog
服务,进行日志审计。
1.6.1 检查软件是否已安装
[oldgirl@s1 ~]$
rpm -qa sudo rsyslog
rsyslog-5.8.10-10.el6_6.x86_64
sudo-1.8.6p3-19.el6.x86_64
1.6.2 配置/etc/sudoers
[root@s1 ~]# echo "Defaults logfile=/var/log/sudo.log">>/etc/sudoers
#<==
只需要往配置文件里加一条记录,
超级简单
!
[root@s1 ~]# tail -1 /etc/sudoers
#<==
验证
Defaults logfile=/var/log/sudo.log
[root@s1 ~]# visudo -c
#<==
检查语法
/etc/sudoers:解析正确
1.6.3 验证
[root@s1 ~]#
su - oldgirl
#<==
切换到
oldgirl
用户
[oldgirl@s1 ~]$
sudo -l
#<==
列出能执行的命令
省略……
用户 oldgirl 可以在该主机上运行以下命令:
(root,oldboy) /usr/sbin/useradd, /usr/sbin/userdel, /usr/bin/passwd [A-Za-z]*,/bin/chown, /bin/chmod, (root,oldboy)/sbin/fdisk, /sbin/parted, (root, oldboy) /sbin/ifconfig, /etc/init.d/network,(root, oldboy) /sbin/reboot, /sbin/halt
[oldgirl@s1 ~]$
sudo useradd wang
#<==sudo
来执行添加用户命令
[oldgirl@s1 ~]$
su -
#<==
切换回
root
密码:
[root@s1 ~]# cat /var/log/sudo.log
#<==
查看
sudo
审计日志
Jul 26 20:31:46 : oldgirl : TTY=pts/0 ;PWD=/home/oldgirl ; USER=root ;
COMMAND=
list
#<==oldgirl
用户的
sudo
操作行为,被记录下来了
Jul 26 20:32:02 : oldgirl : TTY=pts/0 ;PWD=/home/oldgirl ; USER=root ;
COMMAND=
/usr/sbin/useradd wang
#<==oldgirl
的操作行为,会全部被记录下来
[oldgirl@s1 root]$
sudo rm -f /etc/hosts
#<==rm
命令不允许执行
[sudo] password for oldgirl:
对不起,用户 oldgirl 无权以 root 的身份在 s1 上执行 /bin/rm -f /etc/hosts。
[root@s1 ~]# cat /var/log/sudo.log
#<==
查看
sudo
审计日志
Jul 26 20:31:46 : oldgirl : TTY=pts/0 ;PWD=/home/oldgirl ; USER=root ;
COMMAND=list
Jul 26 20:32:02 : oldgirl : TTY=pts/0 ;PWD=/home/oldgirl ; USER=root ;
COMMAND=/usr/sbin/useradd wang
Jul 26 20:37:40 :
oldgirl
: 命令禁止使用 ; TTY=pts/0 ; PWD=/root ;
USER=root ; COMMAND=
/bin/rm -f /etc/hosts
#<==
操作失败的命令,也会被记下来