我时不时会收到一些奇怪的请求,要求提供远程支持、故障排除和/或在 Linux 系统上进行性能调整。
较大的公司通常已经制定了完善的程序来为供应商/供货商提供远程访问,我只需遵守这些程序即可。(无论好坏。)
另一方面,小公司和个人总是向我寻求指导,指导他们如何设置我。通常他们的服务器直接连接到互联网,现有的安全措施包括其 Linux 发行版的默认设置。
我几乎总是需要 root 级别访问权限,而为我设置访问权限的人并不是专家系统管理员。我不想要他们的 root 密码,而且我也很确定我的行为不会是恶意的,但我应该给出什么合理简单的指令:
- 建立帐户并安全地交换凭证
- 设置 root(sudo)访问权限
- 限制对我的帐户的访问
- 提供审计线索
(是的,我知道并且总是警告那些客户,一旦我拥有管理员权限,隐藏任何恶意行为都是微不足道的,但让我们假设我没有什么可隐瞒的并积极参与创建审计跟踪。)
以下步骤有哪些可以改进?
我当前的指令集:
建立帐户并安全地交换凭证
我提供了一个密码哈希并要求我的帐户使用该加密密码设置,这样我们就不需要传输明文密码,我是唯一知道密码的人,我们不会从可预测的弱密码开始。
sudo useradd -p '$1$********' hbruijn
我提供了一个公钥 SSH(每个客户端特定的密钥对),并要求他们使用该密钥设置我的帐户:
sudo su - hbruijn
mkdir -p ~/.ssh
chmod 0700 ~/.ssh
echo 'from="10.80.0.0/14,192.168.1.2" ssh-rsa AAAAB3NzaC1y***...***== hbruijn@serverfault' >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys
设置 root(sudo)访问权限
我要求客户使用他们最喜欢的编辑器为我设置 sudo,sudo sudoedit
并附加到/etc/sudoers
:
hbruijn ALL=(ALL) ALL
限制对我的帐户的访问
通常客户端仍然允许基于密码的登录,我要求他们添加以下两行以/etc/ssh/sshd_config
至少将我的帐户限制为仅使用 SSH 密钥:
Match user hbruijn
PasswordAuthentication no
根据客户端的不同,我将通过单个堡垒主机路由所有 SSH 访问,以始终提供单个静态 IP 地址(例如 192.168.1.2)和/或提供我的 ISP 使用的 IP 地址范围(例如 10.80.0.0/14)。如果 SSH 访问受到限制,客户端可能需要将这些添加到防火墙白名单中(尽管 ssh 通常不受过滤)。
from=
您已经在文件中看到了这些 IP 地址的限制~.ssh/authorized_keys
,限制了我的密钥可用于访问其系统的主机。
提供审计线索
到目前为止还没有客户要求我这样做,而且除了以下几点以外我也没有做任何具体的事情来掩盖自己的错误:
我尝试始终使用sudo
单个命令,并尝试避免使用sudo -i
或sudo su -
。我尝试不使用sudo vim /path/to/file
而是使用sudoedit
。
默认情况下,所有特权操作都将记录到 syslog (和/var/log/secure
):
Sep 26 11:00:03 hostname sudo: hbruijn : TTY=pts/0 ; PWD=/home/hbruijn ; USER=jboss ; COMMAND=sudoedit /usr/share/jbossas/domain/configuration/domain.xml
Sep 26 11:00:34 hostname sudo: hbruijn : TTY=pts/0 ; PWD=/home/hbruijn ; USER=root ; COMMAND=/usr/bin/tail -n 5 /var/log/messages
我基本上放弃了定制我的工作环境,我真正做的唯一一件事就是在~/.bash_profile
增加 bash 历史记录时进行以下设置并包含时间戳:
export HISTSIZE=99999999999
export HISTFILESIZE=99999999999
export HISTIGNORE="w:ls:ls -lart:dmesg:history:fg"
export HISTTIMEFORMAT='%F %H:%M:%S '
shopt -s histappend
答案1
我唯一想到的就是在通话--expiredate
中添加内容adduser
。
这样客户就知道您的访问权限将在固定日期自动过期。
他仍然需要信任您,因为您具有 root 访问权限并且仍然可以删除过期标志。
答案2
您可以使用脚本(1)公用事业。
$ script session.log
Script started, file is session.log
$ ls
file1 session.log
exit
Script done, file is session.log
然后一切在 session.log 中。
答案3
由于您已经使用 SSH 公钥登录,如果您不提供密码哈希,它会稍微收紧一些;而是告诉他们使用adduser --disabled-password
(等效地,useradd -p '!'
我认为),这实际上相当于PasswordAuthentication no
该帐户,而且窥探您电子邮件的人不可能强行破解密码哈希并以您的身份登录。
答案4
当您要使用公钥/私钥时,为什么还要提供密码?
公钥是用来共享的,所以您应该使用它来安全地交换凭证,而不是散列密码。
sudo useradd --disabled-password hbruijn
发送公钥时,请通过第二个渠道(例如电话)验证指纹,这样您就知道没有人对其进行了更改。
由于你现在没有密码来使用 sudo,你还需要将 sudoers 文件中的行更改为
hbruijn ALL=(ALL) NOPASSWD:ALL
如果您不习惯没有 sudo 密码,并且确实想要一个密码,那么您仍然不需要发送您的散列密码,而是让帐户在没有密码的情况下创建,设置您的公钥,一旦您的帐户设置好,您就可以通过 ssh 登录并运行
passwd
来设置您自己的密码。