成都建立网站的公司,建筑工程公司有什么职位,做个商城网站要多少钱,电脑网络公司经营范围sudo 表示 “superuser do”#xff0c;它允许已验证的用户以其他用户的身份来运行命令。其他用户可以是普通用户或者超级用户。然而#xff0c;大部分时候我们用它来提权运行命令#xff0c;以替代直接使用 root 用户的操作。
sudo 命令与安全策略配合使用#xff0c;安全…sudo 表示 “superuser do”它允许已验证的用户以其他用户的身份来运行命令。其他用户可以是普通用户或者超级用户。然而大部分时候我们用它来提权运行命令以替代直接使用 root 用户的操作。
sudo 命令与安全策略配合使用安全策略可以通过文件 /etc/sudoers 来配置。其安全策略具有高度可拓展性支持插件扩展。默认情况下 /etc/sudoers 是不能被任何人直接编辑的因为它的权限是 440虽然也可以对其赋予写权限后再编辑但推荐使用 visudo 命令编辑该文件。
sudo 命令的工作流程
使用sudo 命令时sudo程序会读取和解析 /etc/sudoers 文件查找调用sudo命令的用户比如test用户及其权限。然后提示调用该命令的用户test用户输入密码或者也可以通过 NOPASSWD 标志来跳过密码验证。之后sudo 创建一个子进程调用 setuid() 来切换到目标用户可能是root也可能是其他用户。最后它会在上述子进程中执行参数给定的 shell 或命令。
sudo 命令授权配置
USER/GROUP HOST(USER[:GROUP]) [NOPASSWD:] COMMANDSUSER/GROUP: 表示需要被授权的用户或者组谁有权限调用sudo命令比如test如果是组则需要以 % 开头HOST: 表示允许从哪些主机登录的用户可以运行 sudo 命令ALL 表示允许从任何终端、机器访问(USER[:GROUP]): 表示使用 sudo 可切换的用户或者组可以使用谁的权限比如root组可以不指定ALL 表示可以切换到系统的所有用户NOPASSWD: 如果指定则该用户或组比如test使用 sudo 时不必输入密码COMMANDS: 表示运行指定的命令ALL 表示允许执行所有命令
# 允许 sudo 组执行所有命令
%sudo ALL(ALL:ALL) ALL# 允许用户escape执行所有命令且无需输入密码
escape ALL (ALL) NOPASSWD: ALL# 仅允许用户escape执行 echo, ls 命令
escape ALL (ALL) NOPASSWD: /bin/echo /bin/ls# 运行本机的用户escape执行关机命令
escape localhost/sbin/shutdown -h now# 允许 users 用户组中的用户像 root 用户一样使用 mount、unmount、chrom 命令
%users ALL/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom 配置 Defaults 选项
# 指定用户尝试输入密码的次数默认值为3
Defaults passwd_tries5# 设置密码超时时间默认为 5 分钟
Defaults passwd_timeout2默认 sudo 询问用户自己的密码添加 targetpw 或 rootpw 配置可以让 sudo 询问 root 密码
Defaults targetpw# 指定自定义日志文件
Defaults logfile/var/log/sudo.log# 要在自定义日志文件中记录主机名和四位数年份可以加上 log_host 和 log_year 参数
Defaults log_host, log_year, logfile/var/log/sudo.log# 保持当前用户的环境变量
Defaults env_keep LANG LC_ADDRESS LC_CTYPE COLORS DISPLAY HOSTNAME EDITOR
Defaults env_keep ftp_proxy http_proxy https_proxy no_proxy# 安置一个安全的 PATH 环境变量
Defaults secure_path/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 如何更加安全的授权服务器权限
我们管理的服务器开发或者其他人员需要登录该服务器进行环境调试或者问题复现等情况。这时就需要我们给对应的用户开通登录的访问权限。但是如果我们直接编辑 /etc/sudoers 文件的话之后当对方使用完成之后我就还需要手动进行清理。如果我们忘记的话该开发或者其他人员将一直可以登录该服务器会有一定程度的安全问题。
不幸的是对应临时授权的话/etc/sudoers 文件中没有对应的配置可以对某个用户或者用户组进行指定范围的时间授权。当用户到达指定时间点之后将拒绝该用户再次进行登录了。对应此种情况我们可以通过 crontab 定时任务与 /etc/sudoers.d 目录的机制可以完美的解决上述问题。
我们通过定时任务的定时执行目录来定时刷掉 /etc/sudoers.d/ 目录下的用户或者用户组的授权配置文件。比如我们需要定时每日刷掉今日临时授权的用户或者用户可以在 /etc/cron.daily 目录下面创建用于删除 /etc/sudoers.d/ 目录的 rm -rf 命令之后在固定的时间会自动删除。对应授权用户我们使用在 /etc/sudoers.d/ 目录下创建单独的配置文件而不是直接修改 /etc/sudoers 文件。
# Crontab有多种定时机制
# 下述分别表示每天、每时、每月、每周定时执行
$ ls -dl /etc/cron.* | grep -v cron.d$
drwxr-xr-x 2 root root 4096 May 15 06:18 /etc/cron.daily
drwxr-xr-x 2 root root 4096 Feb 14 2019 /etc/cron.hourly
drwxr-xr-x 2 root root 4096 Feb 14 2019 /etc/cron.monthly
drwxr-xr-x 2 root root 4096 Jun 18 09:57 /etc/cron.weekly# 创建单独的授权配置文件
$ ls -lh /etc/sudoers.d/
-r--r----- 1 root root 666 Oct 6 2017 lisi
-r--r----- 1 root root 958 Jan 18 2018 zhangsan# 查看授权配置文件的内容
$ cat /etc/sudoers.d/zhangsan
ALL ALL (root) NOPASSWD: zhangsan
如何解决 sudo 命令找不到环境变量
我们日常在使用 sudo 命令的时候常常会遇到当切换用户之后发现之前设置的环境变量怎么不见了呢这是因为我们执行 sudo 命令之后会切换用户如果保留环境变量会有一定的安全问题系统会默认重置环境变量为安全的环境变量。先前设置的变量都会失效只有少数配置文件中指定的环境变量能够保存下来。
我们可以看一下 sudo 配置文件 /etc/sudoers 来找找作用原因。我们执行如下命令之后可以看到如下输入(有可能和我这里的不一样)。其中 env_reset 表示默认会重置环境变量因此我们自定义的变量会在 sudo 命令执行之后失效也就不会正确获取变量值了。而 env_keep 则表示用于保留部分环境变量不被重置需要保留的变量就写入双引号之中可自行追加需要保留的变量。最后就是 secure_path 变量其作用就是包含的路径将被当做 sudo 环境的 PATH 变量来使用。如果在 sudo 环境无法找到某些命令那么可以将这些命令的路径加入该配置项之中。
$ sudo sed /^#/d;/^$/d /etc/sudoers
Defaults env_reset
Defaults env_keep COLORS IDSPLAY HOSTNAME HISTSIZE LS_COLORS
Defaults env_keep MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS
Defaults secure_path/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
我们知道原因之后就可以针对上述情况作出不用的处理方式来解决 sudo 命令找不到环境变量的问题。
第一种解决方法就是在使用的时候使用 -E 参数。加上 -E 选项后用户可以在 sudo 执行时保留当前用户已存在的环境变量不会被 sudo 重置。另外如果用户对于指定的环境变量没有权限则会报错。需要注意的是在内部测试机器中安全性要求不高的情况下使用。
$ sudo sudo -E
第二种解决方法就是修改 sudo 配置文件。可以通过修改 /etc/sudoers 文件的 env\_keep 和 secure\_path 配置项来指定 sudo 环境中需要保留的环境变量和路径。当然我们也可以把配置文件的变量 !env\_reset 给去掉这样就不会有限制了。
$ sudo vim /etc/sudoers
Defaults !env_reset