跳过正文

Linux 系统安全加密之 sudo 授权

Linux Sudo
目录

sudo 是一个在 Linux 系统中用于执行特权命令的超级用户工具。sudo 命令默认安装在大多数 Linux 发行版中,它可以允许用户以 root 用户权限执行某些命令,只需在 linux 系统 /etc/sudoers 文件中配置用户和组执行 sudo 命令的权限,root 用户默认配置 sudo 权限。

利用 sudo 实现授权
#

sudo 介绍
#

sudo: superuser do

sudo 是允许普通用户执行一些或全部的root命令的一个工具,如:halt,reboot,su等。

这样可以减少系统对root账户的依赖,使root不必经常在线,从而可以提高系统安全性,在最早之前,一般用户管理系统的方式是利用su切换成为超级管理员,但是,使用su切换,必须要先知道root用户的密码。

sudo 于1980年前后推出,sudo 使一般用户不需要知道root 用户的密码即可获得权限。

root 用户将普通用户的名字,可以执行的特定命令,按照哪种用户或用户组的身份执行等信息,登记在特殊文件中(通常是 /etc/sudoers),即完成对该用户的授权(此时此用户被称为 sudoer),在一般用户需要取得特殊权限时,其可在命令前加上 sudo,此时sudo会询问该用户自己的密码(以确定是当前用户在操作),回答后系统即会将该命令的进程以root用户的权限运行,之后的一段时间内(默认5分钟(redhat 系列),可在/etc/sudoers 中自定义),使用sudo 不需要再次输入密码,由于不需要root 用户密码,部份unix 系统甚至利用 sudo 使一般用户取代root用户作为管理员账号,例如:Ubuntu,Mac OS X等。

sudo特性

  • sudo能够授权指定用户在指定主机上运行某些命令。如果未授权用户尝试使用 sudo,会提示联系管理员
  • sudo提供了丰富的日志,详细地记录了每个用户干了什么。它能够将日志传到中心主机或者日志服务器
  • sudo使用时间戳文件来执行类似的“检票”系统。当用户调用sudo并且输入它的密码时,用户获得了一张存活期为5分钟的票
  • sudo的配置文件是sudoers文件,它允许系统管理员集中的管理用户的使用权限和使用的主机。它所存放的位置默认是在/etc/sudoers,属性必须为0440

sudo 组成
#

软件包

[root@ubuntu ~]# dpkg -l sudo

配置文件

#主配置文件
/etc/sudo.conf

#授权规则配置文件
/etc/sudoers
/etc/sudoers.d/*

审计文件

/var/db/sudo
/var/log/auth.log

工具命令

#安全编辑授权规则文件和语法检查工具
/usr/sbin/visudo

#授权编辑规则文件的工具
/usr/bin/sudoedit

#执行授权命令
/usr/bin/sudo

#语法检查
visudo -c
visudo -f /etc/sudoers.d/test

sudo 命令
#

sudo [options...] [command]
sudo [options...] file...

#常用选项
-b|--background #在后台执行
-B|--bell #响铃
-E|--preserve-env #继承当前环境变量
-e|--edit filename... #编辑文件
-g|--group=group #以指定组执行
-H|--set-home #指定切换用户的家目录
-h|--host=host #在指定主机上执行
-i|--login #直接登录
-K|--remove-timestamp #删除时间戳文件,则下次执行要重新输入密码
-k|--reset-timestamp #清除时间戳,则下次执行要重新输入密码
-l|--list #列出指定用户己配置的sudo规则,不指定用户则是查看当前登录用户
-p|--prompt=prompt #改变密码询问时的提示语句
-s|--shell #以指定shell来执行
-U|--other-user=user #配合-l使用,指定要查看的用户
-u|--user=user #指定要代表的用户,默认root
-V|--version #显示版本
-h|--help #显示帮助
-v|--validate #再延长密码有效期5分钟

sudo 授权规则配置
#

配置文件:

/etc/sudoers
/etc/sudoers.d/*

配置格式:

user host=(runas) [TAG:]command #授权user用户可以在host主机上以runas的身份执行command,TAG可为空

#可使用通配符
? #任意单个字符
* #任意长度字符
[abc] #匹配abc中的一个字符
[!abc] #匹配任意一个除abc之外的字符
\x #转义
[[alpha]] #字母

#user 和 runnas
userName #用户名
#uid #用户ID
%groupName #组名
%#gid #组ID
User_Alias #user别名
Runas_Alias #runas别名

#host
ip #ip地址
hostname #主机名
network/netmask #网段/子网掩码
Host_Alias #别名

#command
cmmand #具体命令
directory/* #某个目录下所有命令
sudoedit #sudoedit命令,有此命令就可以编辑sudo规则
Cmnd_Alias #命令别名

别名:

#类型
User_Alias|Runas_Alias|Host_Alias|Cmnd_Alias

#格式
Alias_Type NAME = item1, item2, ...

#别名名称由大写字母开始,后面接大写字母,数字,下划线
NAME = [A-Z]([A-Z][0-9]_)*

配置范例:

#指定IP或网段的写法,要求在对应主机上也有该配置
vxbus 10.0.0.158=(root) /bin/ls /root/
vxbus 10.0.0.0/24=(root) /bin/touch /root/from-vxbus
vxbus 10.0.0.157=(root) /sbin/shutdown -h now
visudo 实现语法检查

[root@ubuntu ~]# visudo

查看配置

#在10.0.0.158主机上查看配置
[root@ubuntu ~]# sudo -l
......
User root may run the following commands on rocky86:
    (ALL) ALL

#查看指定用户
vxbus@ubuntu:~$ sudo -l -U vxbus
......
User vxbus may run the following commands on rocky86:
    (root) /bin/ls /root/
    (root) /bin/touch /root/from-vxbus

#该用户没有配置sudo规则
tom@ubuntu:~$ sudo -l
[sudo] password for tom:
Sorry, user tom may not run sudo on ubuntu.

#在10.0.0.157主机上查看
[root@ubuntu ~]# sudo -l -U vxbus
......
User vxbus may run the following commands on rocky86:
    (root) /bin/touch /root/from-vxbus
    (root) /sbin/shutdown -h now
#查看指定用户,alex是初始用户,属于sudo组
alex@ubuntu:~$ sudo -l
[sudo] password for alex:
Matching Defaults entries for alex on ubuntu:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty

User alex may run the following commands on ubuntu:
    (ALL : ALL) ALL

默认sudo到root身份执行

vxbus@ubuntu:~$ sudo ls /root/
[sudo] password for vxbus:
0722 0920 ca.sh id_rsa.pub Music test
......

#五分钟内再次执行,则不需要输入密码
vxbus@ubuntu:~$ sudo touch /root/from-vxbus

指定执行用户

#配置
vxbus   10.0.0.158=(tom)   /bin/ls /home/tom/
vxbus   10.0.0.159,10.0.0.158=(tom,jerry)   /bin/touch /tmp/from-vxbus.txt

#查看
vxbus@ubuntu:~$ sudo -l
[sudo] password for vxbus:
......
User vxbus may run the following commands on rocky86:
    (root) /bin/ls /root/
    (root) /bin/touch /root/from-vxbus
    (tom) /bin/ls /home/tom/
    (tom, jerry) /bin/touch /tmp/from-vxbus.txt

#指定执行用户
vxbus@ubuntu:~$ sudo -u tom ls /home/tom/
from-vxbus test

vxbus@ubuntu:~$ sudo -u jerry touch /tmp/from-vxbus.txt

vxbus@ubuntu:~$ ll /tmp/from-vxbus.txt
-rw-r--r-- 1 jerry jerry 0 Sep 25 16:07 /tmp/from-vxbus.txt

id配置写法

#1011,#1012,%#1013,u2   ALL=(#0)   /bin/cat /etc/shadow
%#1013,tom   ALL=(%#0)   /bin/cat /var/log/secure

tom@ubuntu:~$ id
uid=1012(tom) gid=1012(tom) groups=1012(tom)

tom@ubuntu:~$ sudo -l
......
User tom may run the following commands on ubuntu:
    (#0) /bin/cat /etc/shadow #来源于用户ID配置
    (%#0) /bin/cat /var/log/auth.log #来源于用户名配置 

#组ID
u1@ubuntu:~$ id
uid=1013(u1) gid=1013(u1) groups=1013(u1)
u1@ubuntu:~$ sudo -l
[sudo] password for u1:
......
User u1 may run the following commands on ubuntu:
    (#0) /bin/cat /etc/shadow #来源于用户组ID配置
    (%#0) /bin/cat /var/log/auth.log #来源于用户组ID配

别名写法

User_Alias ANLMAL=tom,jerry,%vxbus,#1013,%#1014
Runas_Alias ROOT=root
Host_Alias LOCAL=rocky86,10.0.0.158
Cmnd_Alias CMD=/sbin/init *,/usr/bin/yum update
Cmnd_Alias SHUTDOWN=/sbin/shutdown -h now

ANLMAL LOCAL=(ROOT) CMD,SHUTDOWN

#来源于用户名 tom
tom@ubuntu:~$ id
uid=1012(tom) gid=1012(tom) groups=1012(tom)
tom@ubuntu:~$ sudo -l
[sudo] password for tom:
......
User tom may run the following commands on ubuntu:
    (root) /sbin/init *, /usr/bin/yum update, /sbin/shutdown -h now

#来源于组名 vxbus
vxbus@ubuntu:~$ id
uid=1010(vxbus) gid=1010(vxbus) groups=1010(vxbus)
vxbus@ubuntu:~$ sudo -l
[sudo] password for vxbus:
......
User vxbus may run the following commands on ubuntu:
    (root) /sbin/init *, /usr/bin/yum update, /sbin/shutdown -h now

#来源于用户ID 1013
u1@ubuntu:~$ id
uid=1013(u1) gid=1013(u1) groups=1013(u1)
u1@ubuntu:~$ sudo -l
[sudo] password for u1:
......
User u1 may run the following commands on ubuntu:
    (root) /sbin/init *, /usr/bin/yum update, /sbin/shutdown -h now

#来源于组ID 1014
u2@ubuntu:~$ id
uid=1014(u2) gid=1014(u2) groups=1014(u2)
u2@ubuntu:~$ sudo -l
[sudo] password for u2:
......
User u2 may run the following commands on ubuntu:
    (root) /sbin/init *, /usr/bin/yum update, /sbin/shutdown -h now

配置不需要密码验证

#不要密码,排除useradd
vxbus ALL=(root) NOPASSWD: /usr/sbin/,!/usr/sbin/useradd

vxbus@ubuntu:~$ id
uid=1010(vxbus) gid=1010(vxbus) groups=1010(vxbus)

vxbus@ubuntu:~$ sudo -l #不需要密码验证
......
User vxbus may run the following commands on ubuntu:
    (root) NOPASSWD: /usr/sbin/, !/usr/sbin/useradd

#可执行userdel
vxbus@ubuntu:~$ userdel -h
Usage: userdel [options] LOGIN

vxbus@ubuntu:~$ touch abc
vxbus@ubuntu:~$ sudo touch xyz
vxbus@ubuntu:~$ ls
0910 09102 abc xyz
vxbus@ubuntu:~$ sudo ls
Sorry, user vxbus is not allowed to execute '/bin/ls' as root on rocky86.

指定默认切换账户

Defaults:vxbus runas_default=tom
vxbus ALL=(tom,jerry) ALL

vxbus@ubuntu:~$ sudo -l
[sudo] password for vxbus:
......
User vxbus may run the following commands on ubuntu:
    (tom, jerry) ALL

#默认sudo 到 tom
vxbus@ubuntu:~$ sudo touch /tmp/from-vxbus
vxbus@ubuntu:~$ ll /tmp/from-vxbus
-rw-r--r-- 1 tom tom 0 Sep 29 08:39 /tmp/from-vxbus

#指定sudo 到 jerry
vxbus@ubuntu:~$ sudo -u jerry touch /tmp/from-vxbus-2
vxbus@ubuntu:~$ ll /tmp/from-vxbus-2
-rw-r--r-- 1 jerry jerry 0 Sep 29 08:41 /tmp/from-vxbus-2

配置排除规则

vxbus ALL=(root) /usr/sbin/,!/usr/sbin/useradd,!/usr/sbin/userdel

vxbus@ubuntu:~$ sudo -l
[sudo] password for vxbus:
......
User vxbus may run the following commands on ubuntu:
    (root) /usr/sbin/, !/usr/sbin/useradd, !/usr/sbin/userdel

#没有权限执行
vxbus@ubuntu:~$ sudo useradd user1
Sorry, user vxbus is not allowed to execute '/sbin/useradd user1' as root on ubuntu.

配置中转规则

vxbus@ubuntu:~$ vim /etc/sudoers
tom ALL=(root) /usr/bin/cat /etc/shadow
vxbus ALL=(tom) /usr/bin/sudo /usr/bin/cat /etc/shadow

#执行
vxbus@ubuntu:~$ sudo -u tom sudo /usr/bin/cat /etc/shadow

配置bug

vxbus ALL=(root) NOPASSWD: /usr/bin/cat /var/log/message*

vxbus@ubuntu:~$ id
uid=1010(vxbus) gid=1010(vxbus) groups=1010(vxbus)
vxbus@ubuntu:~$ cat /var/log/messages
cat: /var/log/messages: Permission denied

vxbus@ubuntu:~$ sudo cat /var/log/messages | head -n 3
......

#bug,能打开其它文件
vxbus@ubuntu:~$ sudo cat /var/log/messages /etc/shadow

解决方案

vxbus ALL=(root) NOPASSWD: /usr/bin/cat /var/log/syslog*, !/usr/bin/cat /var/log/syslog* *

修改生命周期时长

[root@ubuntu ~]# sudo -V | grep time
......
Lecture user the first time they run sudo
Authentication timestamp timeout: 15.0 minutes #默认一次密码有效期15分钟
Password prompt timeout: 0.0 minutes
Path to authentication timestamp dir: /run/sudo/ts #sudo切换用户的认证时间记录文件
Type of authentication timestamp record: tty
Sudo log server timeout in seconds: 30
Path to the file that is created the first time sudo is run:
~/.sudo_as_admin_successful

#修改配置文件,添加如下行
[root@ubuntu ~]# vim /etc/sudoers
Defaults timestamp_timeout=2

#再次查看
[root@rocky86 ~]# sudo -V | grep timeout
Authentication timestamp timeout: 2.0 minutes
......

重置生命周期

vxbus@ubuntu:~$ sudo -l
[sudo] password for vxbus:
......
User vxbus may run the following commands on ubuntu:
    (root) /usr/sbin/, !/usr/sbin/useradd, !/usr/sbin/userdel

#查看生命周期文件
[root@ubuntu ~]# ls -lh /run/sudo/ts/
total 8.0K
-rw------- 1 root vxbus 112 May 28 20:05 vxbus
-rw------- 1 root alex 168 May 28 17:59 alex

#删除文件
vxbus@ubuntu:~$ sudo -K
[root@ubuntu ~]# ls -lh /run/sudo/ts/
total 4.0K
-rw------- 1 root alex 168 May 28 17:59 alex

#再次sudo 则需要重输密码
vxbus@ubuntu:~$ sudo -l
[sudo] password for vxbus:
......
User vxbus may run the following commands on ubuntu:
    (root) /usr/sbin/, !/usr/sbin/useradd, !/usr/sbin/userdel

#使用 -k 选项,一样也可以重置认证生命周期
vxbus@ubuntu:~$ sudo -k
vxbus@ubuntu:~$ sudo -l
[sudo] password for vxbus:

sudo 生命周期采用的是续命机制,如果认证有效期是2分钟,则只要在2分钟内执行一次 sudo 命令,就可以一直不用输入密码。

相关文章

Linux C自动化编译
Autotools Makefile Linux
在不同的Linux发行版下配置IP
Linux IP
Linux 内核管理
Linux Kernel