sudo

sudo

sudo 是一个可以让用户以其他用户或者用户组的身份来执行命令的程序

sudo支持用于安全策略、安全审计的插件架构,用来输入输出日志。第三方可以开发自己的安全策略与sudo无缝协作。
sudo -u [username] command
sudo -g [groupname] command
默认:
sudo -u root command
比如 sudo echo hello,是以root用户执行了[echo hello]
sudo -l 查询规则匹配
sudo -k 立刻清除准入冷却时间[默认为15分钟]

sudo

sudo -- execute a command as another user

以另一个用户的身份执行命令

用户:

  • 默认为 superuser

  • 安全策略指定的用户

    sudo 允许用户以其他用户的身份去执行一个命令。调用用户的真实 user-id 被用来确定用户名而不是执行命令,然后系统用用户名去查询安全策略。

例如:suda 用户的 user-id 只用来确定用户名是 suda,而不用 suda 的 user-id 执行命令。在通过安全策略以后【sudoers】,使用 root 的 user-id 来执行 echo hello.

作用:隐藏了 suda 的 user-id

suda@sudahome:~$ sudo echo hello
hello

sudoers

#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
Defaults        insults
# This fixes CVE-2005-4890 and possibly breaks some versions of kdesu
# (#1011624, https://bugs.kde.org/show_bug.cgi?id=452532)
Defaults        use_pty

# This preserves proxy settings from user environments of root
# equivalent users (group sudo)
#Defaults:%sudo env_keep += "http_proxy https_proxy ftp_proxy all_proxy no_proxy"

# This allows running arbitrary commands, but so does ALL, and it means
# different sudoers have their choice of editor respected.
#Defaults:%sudo env_keep += "EDITOR"

# Completely harmless preservation of a user preference.
#Defaults:%sudo env_keep += "GREP_COLOR"

# While you shouldn't normally run git as root, you need to with etckeeper
#Defaults:%sudo env_keep += "GIT_AUTHOR_* GIT_COMMITTER_*"

# Per-user preferences; root won't have sensible values for them.
#Defaults:%sudo env_keep += "EMAIL DEBEMAIL DEBFULLNAME"

# "sudo scp" or "sudo rsync" should be able to use your SSH agent.
#Defaults:%sudo env_keep += "SSH_AGENT_PID SSH_AUTH_SOCK"

# Ditto for GPG agent
#Defaults:%sudo env_keep += "GPG_AGENT_INFO"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "@include" directives:

@includedir /etc/sudoers.d
sudo的默认安全策略是sudoers。通过/etc/sudoers这个文件配置,或者通过LDAP来配置。

sudoers 的文件规范

sudoers 文件由两种条目组成:alias 别名,user specifications 用户自定义规范

当一个用户匹配多个条目的时候,总是最后一个匹配项的生效。

sudoers 的语法遵循 EBNF【诺尔范式】

EBNF

EBNF 是一种简洁而精确的语言语法描述方式。每个 EBNF 定义都由产生式规则[production rule]组成。

symbol ::= definition | alternate1 | alternate2 ...

不要和通配符混淆,下列是 EBNF 的含义:

? 上一个symbol是可选的,可以匹配一次,或者不匹配
* 上一个symbol可以匹配零次,或者很多次
+ 上一个symbol可以匹配一次,或者很多次
() 将symbol组成在一起。

Defaults

Defaults        env_reset
# 重置终端,以删除用户变量
Defaults        mail_badpass
# sudo密码尝试错误,发送邮件到root[默认]用户
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
# 用于sudo操作的目录:用来间隔
Defaults        insults
# 在你输入密码错误的时候,发送一个羞辱文本

@includedir /etc/sudoers.d

本文件包含sudoers.d目录下安全策略文件的规则。

root ALL=(ALL:ALL) ALL

{%}[username or alias] [hosts] = (user:group) command
% 用户组
[username or alias] [hosts] = command 是必须的,(user:group)省略的时候,则表示target_user是root
command:
1. ALL
2. 指定程序,如 /usr/bin/kill
3. 标签:指定程序,如NOPASSWD:/usr/bin/apt-get。多个则用','隔开。
GROUPONE ALL = NOPASSWD:/usr/bin/apt-get, PASSWD:/usr/kill 
常用标签:
ALL
NOPASSWD:无需密码
PASSWD:需要密码
NOEXEC:不允许执行
GROUPONE ALL=NOEXEC:/usr/bin/less
# 三种不会询问密码的情况

* root用户
* 目标用户和调用用户是同一个用户
* 策略允许不询问密码

%admin ALL=(ALL) ALL

表示admin组的用户可以在所有主机上的所有用户里执行所有命令。
因为%表示组

Alias


User_Alias		GROUPONE = abby, brent, carl
User_Alias		GROUPTWO = brent, doris, eric,
User_Alias		GROUPTHREE = doris, felicia, grant

Cmnd_Alias		POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restart

Runas_Alias		WEB = www-data, apache
GROUPONE ALL = /usr/bin/apt-get update
没有指定以某个用户执行,则默认为以root用户执行。
GROUPONE	ALL = (WEB) ALL
GROUPONE中的用户,可以在所有主机上用(www-data或者apache)用户的身份执行所有命令

Ubuntu 快速添加 sudoers

1. usermod or gpasswd

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

在 Ubuntu 的 sudoers 中,默认已经将 sudo 用户组添加进去了,所以我们可以将用户添加到 sudo 用户组来添加 sudoers。

sudo usermod -aG [username] sudo

或者

sudo gpasswd -a [username] sudo

2. 添加文件到/etc/sudoers.d/目录下

sudoers.d 目录用来保存 sudo 安全策略文件,和 sudoers 文件的规则相同。

echo 'username ALL=(ALL:ALL)' | sudo tee /etc/sudoers.d/username
将username可执行所有命令的规则添加到/etc/sudoers.d/username文件中,由于/etc/sudoers文件有@includedir /etc/sudoers.d这行规则,所以,sudoers.d目录下的文件,也会被包含进生效的安全规则文件/etc/sudoers。

  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    946 引用 • 943 回帖

相关帖子

回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...