SSH 连接配置

SSH 连接配置

我正在管理几台 Linux 服务器。我将有其他管理员需要访问这些服务器才能对其进行管理。因此,我希望有一种ssh堡垒,它可以通过 Windows 笔记本电脑将用户透明地连接到这些服务器ssh。我不想将用户的公钥复制到我的远程服务器上。我希望将远程服务器的所有公钥都放在堡垒上的存储库中ssh。这可能吗?

如果是,那么要进行哪些配置才能实现这一点?

答案1

AuthorizedKeysCommand我有一个替代方案:将所有客户端的 SSH 密钥保存在一台服务器上,然后配置服务器以向该服务器请求授权的 SSH 密钥。这可以使用sshd_config

来自手册页:

 AuthorizedKeysCommand
         Specifies a program to be used to look up the user's public keys.
         The program must be owned by root and not writable by group or
         others.  It will be invoked with a single argument of the
         username being authenticated, and should produce on standard
         output zero or more lines of authorized_keys output (see
         AUTHORIZED_KEYS in sshd(8)).  If a key supplied by
         AuthorizedKeysCommand does not successfully authenticate and
         authorize the user then public key authentication continues using
         the usual AuthorizedKeysFile files.  By default, no
         AuthorizedKeysCommand is run.

 AuthorizedKeysCommandUser
         Specifies the user under whose account the AuthorizedKeysCommand
         is run.  It is recommended to use a dedicated user that has no
         other role on the host than running authorized keys commands.

该命令可以只是一个脚本,其中包含以下内容:

#! /bin/bash
ssh bastion "cat $HOSTNAME/$1/authorized_keys"

此处服务器AuthorizedKeysCommandUser具有基于密钥(无密码)的登录,并仅从authorized_keys密钥服务器输出主机名/用户组合的文件。另一种方法是:

#! /bin/bash
wget --post-data="host=$HOSTNAME&user=$1" https://bastion

其中密钥服务器运行 HTTP 服务器,该服务器根据主机名和用户返回一组授权密钥。一个文件 PHP 或 Python 脚本就足以处理此类表单。优点是使用 PostgreSQL 或 MySQL 等数据库服务器会更容易。(当然,您不需要需要使用主机名。

我认为这种方法最常用于 LDAP。LDAP 有几个脚本:http://www.sysadmin.org.au/index.php/2012/12/authorizedkeyscommand/http://blather.michaelwlucas.com/archives/1562你可以看看。


要进行设置,请在服务器中创建一个用户(称为authkeys)来运行该命令(或者您可以使用nobody用户):

adduser --disabled-password --disabled-login --shell /usr/sbin/nologin authkeys

在中间服务器(称之为bastion)上,命令略有不同:/bin/bash为了方便起见,我们将 shell 设置为(但你可以限制它):

adduser --disabled-password --disabled-login --shell /bin/bash authkeys

这个没有特权的用户将仅用于连接中间服务器并获取密钥。创建此用户将运行的脚本:

sudo tee -a /usr/local/bin/get_keys.sh <<"EOF"
#! /bin/bash
ssh bastion "cat $HOSTNAME/$1/*.pub 2>/dev/null"
EOF
sudo chmod 0755 /usr/local/bin/get_keys.sh

/etc/ssh/sshd_config编辑服务器上的SSH 服务器配置并添加:

AuthorizedKeysCommand /usr/local/bin/get_keys.sh
AuthorizedKeysCommandUser authkeys

并重新启动 SSH 服务器:

sudo service ssh restart

然后,为简单起见,生成一个 SSH 密钥对,并在所有服务器上为用户使用相同的密钥对authkeys

# On one server
ssh-keygen -N '' -f id_rsa

在所有其他服务器上,复制这些文件id_rsa以及id_rsa.pub上述命令创建的文件,然后将它们添加到authkeys用户的 SSH 配置中:

cp id_rsa* ~authkeys/.ssh/
sudo chown authkeys:authkeys .ssh -R
sudo chmod 0700 .ssh
chmod 0600 .ssh/*

在中间服务器上,将此键添加到authorized_keys列表中:

cat id_rsa.pub >> ~authkeys/.ssh/authorized_keys

最后,在中间服务器上,按照我们上面使用的脚本创建目录结构:

mkdir -p ~authkeys/some_host/some_login

然后将管理员的授权密钥添加到目录:

echo "some_key" > ~authkeys/some_host/some_login/admin1.pub
echo "some_other_key" > ~authkeys/some_host/some_login/admin2.pub

将所有内容切换为 root (或您的用户 - 但除 之外的任何内容authkeys):

chown root:root ~authkeys/* -R
chmod o=rx ~authkeys/*/* 
chmod o=r ~authkeys/*/*/*.pub -R

使用主机名或 IP,但记得更改脚本以使用适当的值。

相关内容