我偶尔会收到奇怪的请求,在Linux系统上提供远程支持,故障排除和/或性能优化。
较大的公司通常已经build立了完善的程序来向供应商/供应商提供远程访问,我只需要遵守这些程序。 (无论好坏。)
另一方面,小公司和个人总是要求我指导他们做什么来build立我。 通常他们的服务器直接连接到互联网,现有的安全措施包括Linux发行版的默认设置。
几乎总是我需要根级别的访问权限,谁将设置访问我不是一个专家系统pipe理员。 我不希望他们的root密码,我也很确定我的行为不会是恶意的,但是我应该给出什么合理简单的指示:
(是的,我意识到并总是警告那些客户,一旦我有pipe理员访问隐藏任何恶意行为是微不足道的,但让我们假设我没有什么可以隐藏和积极参与创build审计跟踪。)
在下面的步骤可以改进什么?
build立一个帐户并安全地交换凭证
我提供了一个密码哈希,并要求我的帐户是使用该encryption的密码设置的,所以我们不需要传输明文密码,我是唯一一个知道密码的人,而且我们不会以一个可预见的弱密码。
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 sudoedit
或使用他们最喜欢的编辑器为我设置sudo,并追加到/etc/sudoers
:
hbruijn ALL=(ALL) ALL
限制访问我的帐户
通常情况下,客户端仍允许使用基于密码的login,并要求他们将以下两行添加到/etc/ssh/sshd_config
,以至less将我的帐户限制为仅使用SSH密钥:
Match user hbruijn PasswordAuthentication no
根据客户端的不同,我将通过单个堡垒主机路由所有的SSH访问,以便始终提供单个静态IP地址(例如192.168.1.2)和/或提供ISP使用的IP地址范围(例如10.80。 0.0 / 14)。 如果SSH访问被限制,客户端可能需要将它们添加到防火墙白名单中(通常情况下ssh并不经过筛选)。
您已经在~.ssh/authorized_keys
文件中将这些IP地址视为from=
限制,限制了可以使用我的密钥访问其系统的主机。
提供审计跟踪
到目前为止,还没有客户要求我这样做,除了以下内容外,我没有做任何具体的事情来掩饰我的屁股:
我尝试一直使用sudo
与单个命令,并尝试防止使用sudo -i
或sudo su -
。 我尽量不使用sudo vim /path/to/file
而是使用sudoedit
。
默认情况下,所有特权操作都将被logging到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历史logging并包含时间戳记:
export HISTSIZE=99999999999 export HISTFILESIZE=99999999999 export HISTIGNORE="w:ls:ls -lart:dmesg:history:fg" export HISTTIMEFORMAT='%F %H:%M:%S ' shopt -s histappend
唯一想到的就是joinadduser
调用。
因此,客户知道您的访问将在固定的date自动失效。
他仍然需要信任你,因为你有root权限,仍然可以删除过期标志。
您可以使用脚本(1)实用程序logging您的会话。
$ script session.log Script started, file is session.log $ ls file1 session.log exit Script done, file is session.log
那么一切都在session.log中。
由于您已经使用SSH公钥login,如果您没有提供密码哈希值,它会稍微收敛一些; 而是告诉他们使用adduser --disabled-password
(相当于useradd -p '!'
,我认为),这实际上相当于该账户的PasswordAuthentication no
,再加上你的电子邮件没有被窥探的机会可能蛮力密码哈希和login为你。
当你打算使用公钥/私钥时,为什么要提供一个密码?
公钥是为了共享,所以这是你应该用来安全地交换凭证,而不是散列的密码。
sudo useradd --disabled-password hbruijn
在发送您的公钥时,请通过第二个通道validation指纹,如电话,所以您知道没有人在进行改变。
既然你现在没有密码来使用sudo,你还需要在sudoers文件中改变你的行
hbruijn ALL=(ALL) NOPASSWD:ALL
如果您对sudo没有密码并且确实需要密码感到不舒服,那么您仍然不需要发送哈希密码,让帐户创build时不需要密码,设置您的公钥,并且一旦您的帐户设置你可以通过sshlogin并运行passwd
来设置你自己的密码。