添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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 参数说明

  • sudo

-l:查看授权情况,列出用户在主机上可用的和被禁止的命令

-k:删除时间戳, 时间戳默认5分钟 也会失效

-u:指定某个用户身份去执行特定的命令操作

  • visudo:edit the sudoers file

-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 #<== 操作失败的命令,也会被记下来


Linux visudo Linux命令总结