如何sudo
在 RHEL(Fedora、CentOS 等)或 Ubuntu 发行版上设置无密码访问?(如果跨发行版都一样,那就更好了!)
设置:个人和/或实验室/培训设备,无需担心未经授权的访问(即设备位于非公共网络上,并且任何/所有用户都是完全信任的,并且设备的内容是“普通的”) .
今天发现作为我 sudo 进入的不同用户运行屏幕将不起作用!
IE
ssh bob@server # ssh into server as bob
sudo su "monitor" -
screen # fails: Cannot open your terminal '/dev/pts/0'
Run Code Online (Sandbox Code Playgroud)
我有一个以“监视器”用户身份运行的脚本。我们在屏幕会话中运行它,以便在屏幕上看到输出。问题是,我们有许多用户使用自己的帐户(即 bob、james、susie 等)登录,然后他们 sudo 进入“监视器”用户。让他们访问“监视器”用户是不可能的。
如果我有一个服务器 A,我可以使用我的 ssh 密钥登录,并且我有能力“sudo su - otheruser”,我会丢失密钥转发,因为 env 变量被删除并且套接字只能由我的原始用户读取。有没有一种方法可以通过“sudo su - otheruser”桥接密钥转发,这样我就可以使用转发的密钥(在我的情况下为 git clone 和 rsync )在服务器 B 上做一些事情?
我能想到的唯一方法是将我的密钥添加到其他用户的授权密钥和“ssh otheruser@localhost”,但对于我可能拥有的每个用户和服务器组合来说,这很麻烦。
简而言之:
$ sudo -HE ssh user@host
(success)
$ sudo -HE -u otheruser ssh user@host
Permission denied (publickey).
Run Code Online (Sandbox Code Playgroud) 我想使用ansible来管理一组现有的服务器。我创建了一个ansible_hosts
文件,并-K
使用仅针对单个主机的命令进行了成功测试(使用选项)
ansible -i ansible_hosts host1 --sudo -K # + commands ...
Run Code Online (Sandbox Code Playgroud)
我现在的问题是每个主机上的用户密码都不同,但是我在 Ansible 中找不到处理此问题的方法。
使用-K
,我只被提示预先输入一个 sudo 密码,然后似乎在没有提示的情况下为所有后续主机尝试:
host1 | ...
host2 | FAILED => Incorrect sudo password
host3 | FAILED => Incorrect sudo password
host4 | FAILED => Incorrect sudo password
host5 | FAILED => Incorrect sudo password
Run Code Online (Sandbox Code Playgroud)
迄今为止的研究:
一个StackOverflow 问题,有一个不正确的答案(“使用-K
”),作者的一个回答是“发现我需要无密码的 sudo”
Ansible 文档,其中说“使用无密码 sudo 使事情更容易自动化,但这不是必需的。” (强调我的)
此安全 StackExchange 问题将其视为NOPASSWD
必需的读取
在过去的几个月里,我一直在使用 Linux(Fedora 10,然后是 11)(并且非常享受它——就像重新发现计算机一样,有很多东西要学习)。
我已将我的用户添加到/etc/sudoers
文件的最后一行,如下所示,以便在执行sudo
命令时不会要求我输入密码:
MyUserName ALL=(ALL) NOPASSWD:ALL
Run Code Online (Sandbox Code Playgroud)
现在,每次我使用 执行命令时sudo
,它都会在实际执行任务之前暂停一段明显的时间(约 10 秒)。为什么会这样,我该如何解决这个问题?我在 Fedora 11 x86 64 上运行 Sudo 1.7.1 版。
我有一个只能以我的用户名 (myuser) 登录的系统,但我需要以其他用户 (scriptuser) 身份运行命令。到目前为止,我想出了以下来运行我需要的命令:
ssh -tq myuser@hostname "sudo -u scriptuser bash -c \"ls -al\""
Run Code Online (Sandbox Code Playgroud)
但是,如果当我尝试运行更复杂的命令时,例如[[ -d "/tmp/Some directory" ]] && rm -rf "/tmp/Some directory"
我很快就会遇到引用问题。我不确定如何将这个示例复杂命令传递给bash -c
,当\"
已经分隔了我传递的命令的边界时(所以我不知道如何引用 /tmp/Some 目录,其中包含一个空格。
无论引用多么复杂/疯狂,是否有通用解决方案允许我传递任何命令,或者这是我达到的某种限制?是否有其他可能的,也许更具可读性的解决方案?
管理员通过个人用户名登录服务器,然后运行sudo -i
成为 root ,这是公司的政策。运行时sudo -i
,sudo 将创建一个名为 的环境变量SUDO_USER
,其中包含原始用户的用户名。
有没有办法使用类似于以下语法的内容在 syslog 中记录所有命令:
${TIME/DATE STAMP}: [${REAL_USER}|${SUDO_USER}]: ${CMD}
Run Code Online (Sandbox Code Playgroud)
一个示例条目是:
Sat Jan 19 22:28:46 CST 2013: [root|ksoviero]: yum install random-pkg
Run Code Online (Sandbox Code Playgroud)
显然它不必完全是上述语法,它只需要包含最少的真实用户(例如 root)、sudo 用户(例如 ksoviero)和运行的完整命令(例如 yum安装随机包)。
我已经试过了snoopy
,但它不包括SUDO_USER
变量。
我不想注释掉以下行/etc/sudoers
:
Defaults requiretty
Run Code Online (Sandbox Code Playgroud)
相反,我只希望某个用户不需要 tty。如何才能做到这一点?
我想允许某些用户 su 到另一个用户帐户而不必知道该帐户的密码,但不允许访问任何其他用户帐户(即 root)。
例如,我想允许 DBA Tom su 到 oracle 用户,而不是 tomcat 用户或 root。
我想这可以通过 /etc/sudoers 文件来完成 - 有可能吗?如果是这样,如何?
我喜欢通过密钥访问服务器的想法,这样我就不必每次ssh
进入一个盒子时都输入我的密码,我什至锁定了我的用户(不是root
)密码(passwd -l username
),所以没有密钥就不可能登录。
但是如果我需要为sudo
命令输入密码,所有这些都会中断。所以我很想设置无密码sudo
来使事情符合无密码登录。
然而,我一直有一种直觉,它可能会以某种意想不到的方式对我产生适得其反的效果,它似乎有点不安全。这样的设置有什么注意事项吗?您是否建议/不建议为服务器上的用户帐户执行此操作?
澄清
sudo
在交互式用户会话中的使用,而不是用于服务或管理脚本sudo
有一个超时,在此期间我不必重新输入我的密码。但我的音乐会并不是为了浪费额外的时间来实际输入密码。我的想法是根本不必处理密码,因为我认为:
sudo
. 我希望我能避免这种情况。因此,通过这个问题,我想更好地了解一种可能配置相对于其他配置的风险、警告和权衡。
跟进 1
所有的答案都说无密码sudo
是不安全的,因为如果我的个人用户帐户受到威胁,它允许“轻松”提升权限。我明白那个。但另一方面,如果我使用密码,我们会承担密码的所有经典风险(太短或太常见的字符串,在不同的服务中重复等)。但是我想如果我禁用密码验证/etc/ssh/sshd_config
以便您仍然必须有一个密钥才能登录,我可以使用更简单的密码只是为了sudo
更容易输入?这是一个有效的策略吗?
跟进 2
如果我也有root
通过 ssh登录的密钥,如果有人可以访问我的计算机并窃取我的密钥(尽管他们仍然受操作系统的密钥环密码保护!),他们也可以直接访问该root
帐户,绕过sudo
路径。那么访问该root
帐户的策略应该是什么?
sudo ×10
linux ×4
security ×3
bash ×2
password ×2
ssh ×2
agent ×1
ansible ×1
centos ×1
forwarding ×1
gnu-screen ×1
logging ×1
permissions ×1
scripting ×1
ssh-agent ×1