keychain:在 Linux 上为备份脚本设置安全无密码 SSH 访问
OpenSSH 为远程系统提供 RSA 和 DSA 身份验证,无需提供密码。keychain 是一个特殊的 bash 脚本,旨在使基于密钥的身份验证变得异常方便和灵活。与无密码密钥相比,它提供了各种安全优势。
钥匙串如何比无钥匙密码更好?
如果攻击者设法使用无密码密钥登录服务器,则使用密钥的所有其他服务器/工作站也存在安全风险。使用钥匙串或 ssh-agent 攻击者将无法在不破解密码的情况下接触您的远程系统。另一个例子是,如果您的笔记本电脑或硬盘被盗,攻击者可以简单地复制您的密钥并在任何地方使用它,因为密码无法保护它。
keychain 充当 ssh-agent 的管理器,通常从 ~/.bash_profile 运行。它允许您的 shell 和 cron 作业共享单个 ssh-agent 进程。默认情况下,keychain 启动的 ssh-agent 是长期运行的,即使您已从系统注销,它仍将继续运行。如果您想更改此行为,请查看下面描述的--clear和--timeout选项。我们的示例设置如下:
peerbox.example.net.in => Remote Backup Server. Works in pull only mode. It will backup server1.example.net.in and server2.example.net.in. vivek-desktop.example.net.in => My desktop computer. server1.example.net.in => General purpose remote server. server2.example.net.in => General purpose remote web / mail / proxy server.
您需要在peerbox.example.net.in上安装keychain软件,以便您或脚本可以安全地登录到另外两台服务器进行备份。
在CentOS / RHEL / Fedora Linux上安装钥匙串
RHEL/CentOS Linux 用户输入以下命令首先启用 psychotic repo 并在 CentOS 7.x 上安装 keychain 包:
示例输出:
##[*** Install psychotic repo **]##
$ sudo rpm --import http://wiki.psychotic.ninja/RPM-GPG-KEY-psychotic
$ sudo rpm -ivh http://packages.psychotic.ninja/6/base/i386/RPMS/psychotic-release-1.0.0-1.el6.psychotic.noarch.rpm
##[*** install keychain from psychotic repo **]##
$ sudo yum --enablerepo=psychotic install keychain
Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * base: mirror.fibergrid.in * epel: epel.mirror.angkasa.id * extras: mirror.fibergrid.in * updates: mirror.fibergrid.in Resolving Dependencies --> Running transaction check ---> Package keychain.noarch 0:2.8.0-3.el7.psychotic will be installed --> Finished Dependency Resolution Dependencies Resolved ============================================================================= Package Arch Version Repository Size ============================================================================= Installing: keychain noarch 2.8.0-3.el7.psychotic psychotic 44 k Transaction Summary ============================================================================= Install 1 Package Total download size: 44 k Installed size: 97 k Is this ok [y/d/N]: y Downloading packages: keychain-2.8.0-3.el7.psychotic.noarch.rpm | 44 kB 00:01 Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : keychain-2.8.0-3.el7.psychotic.noarch 1/1 Verifying : keychain-2.8.0-3.el7.psychotic.noarch 1/1 Installed: keychain.noarch 0:2.8.0-3.el7.psychotic Complete!
Fedora Linux 用户类型:
$ sudo dnf install keychain
在Debian / Ubuntu Linux上安装钥匙串
要添加包:
示例输出:
$ sudo apt-get update
$ sudo apt-get install keychain
Reading package lists... Done Building dependency tree Reading state information... Done Suggested packages: gnupg-agent ssh-askpass The following NEW packages will be installed: keychain 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. Need to get 27.4 kB of archives. After this operation, 81.9 kB of additional disk space will be used. Get:1 http://mirrors.service.networklayer.com/ubuntu xenial/universe amd64 keychain all 2.8.1-0.1 [27.4 kB] Fetched 27.4 kB in 0s (0 B/s) Selecting previously unselected package keychain. (Reading database ... 81414 files and directories currently installed.) Preparing to unpack .../keychain_2.8.1-0.1_all.deb ... Unpacking keychain (2.8.1-0.1) ... Processing triggers for man-db (2.7.5-1) ... Setting up keychain (2.8.1-0.1) ...
在FreeBSD上安装钥匙串
要安装端口:
# cd /usr/ports/security/keychain/ && make install clean
要添加软件包,请使用 pkg,如下所示:
# pkg install keychain
在OpenBSD上安装钥匙串
要添加软件包,请使用 pkg_add,如下所示:
# pkg_add -v keychain
如何使用密码设置 SSH 密钥?
只需输入以下命令:
$ ssh-keygen -t rsa
或
$ ssh-keygen -t dsa
在出现提示时指定密码。有关详细信息,请参阅以下分步指南:
- 如何在 Linux / UNIX 上设置带有 DSA公钥认证的 SSH(无密码登录)
- 如何使用多个 SSH 密钥进行无密码登录
如何使用钥匙串?
一旦使用密码配置了 OpenSSH 密钥,请更新您的 $HOME/.bash_profile 文件,该文件是您的个人初始化文件,用于登录 BASH shell:
$ vi $HOME/.bash_profile
附加以下代码:
### START-Keychain ### # Let re-use ssh-agent and/or gpg-agent between logins /usr/bin/keychain $HOME/.ssh/id_dsa source $HOME/.keychain/$HOSTNAME-sh ### End-Keychain ###
现在您已将 keychanin 配置为每次登录时调用 keychain 工具。只需从您的桌面注销并重新登录服务器即可测试您的设置:
$ ssh root@www03.example.net.in
示例输出:
# scp $HOME/.ssh/id_dsa.pub server1.example.net.in:~/pubkey
# scp $HOME/.ssh/id_dsa.pub server2.example.net.in:~/pubkey
# ssh server1.example.net.in cat ~/pubkey >> ~/.ssh/authorized_keys2; rm ~/pubkey
# ssh server2.example.net.in cat ~/pubkey >> ~/.ssh/authorized_keys2; rm ~/pubkey
# ssh root@server1.example.net.in
# ssh user@server2.example.net.in
任务:清除或删除所有 ssh-agent 的密钥
# keychain --clear
安全任务:确保入侵者无法使用您现有的 ssh-agent密钥(仅允许 cron 作业使用无密码登录)
这个想法很简单,只允许备份 shell 脚本和其他 cron 作业允许无密码登录,但所有用户(包括入侵者)都必须提供用于交互式登录的密码密钥。这是通过删除所有 ssh-agent 的密钥来完成的。此选项将提高安全性,并且它仍允许您的 cron 作业在您注销时使用您的 ssh 密钥。按如下方式更新您的 ~/.bash_profile:
/usr/bin/keychain --clear $HOME/.ssh/id_dsa
如果您使用 RSA,请使用:
/usr/bin/keychain --clear $HOME/.ssh/id_rsa
现在,只需登录远程服务器框一次:
$ ssh root@peerbox.example.net.in
注销(仅授予对备份等 cron 作业的访问权限)
# logout
任务:使用钥匙串和备份脚本通过 cron 作业实现无密码登录
在 rsync、tar over ssh 或任何其他网络备份命令之前添加以下内容:
source $HOME/.keychain/$HOSTNAME-sh
以下是 rsync 脚本的示例:
#!/bin/bash # Remote Server Rsync backup Replication Shell Script # Local dir location LOCALBAKPOINT=/iscsi LOCALBAKDIR=/backups/server1.example.net.in/wwwroot # Remote ssh server setup SSHUER=root SSHSERVER=server1.example.net.in SSHBACKUPROOT=/wwwroot # Make sure you can log in to remote server without a password source $HOME/.keychain/$HOSTNAME-sh # Make sure local backup dir exists [ ! -d ${LOCALBAKPOINT}${LOCALBAKDIR} ] && mkdir -p ${LOCALBAKPOINT}${LOCALBAKDIR} # Start backup /usr/bin/rsync --exclude '*access.log*' --exclude '*error.log*' -avz -e 'ssh ' ${SSHUER}@${SSHSERVER}:${SSHBACKUPROOT} ${LOCALBAKPOINT}${LOCALBAKDIR} # See if backup failed or not to /var/log/messages file [ $? -eq 0 ] && logger 'RSYNC BACKUP : Done' || logger 'RSYNC BACKUP : FAILED!'
如果您正在使用 rsnapshot 备份服务器(请参阅如何设置RHEL / CentOS / Debian rsnapshot备份服务器),请将以下内容添加到您的 /etc/rsnapshot.conf 文件中
# Get ssh login info via keychain cmd_preexec source /root/.keychain/hostname.example.com-sh
关于钥匙串和安全的说明
- 拥有致命编码技能的高级攻击者仍然可以从内存中获取密钥。但是,钥匙串使得普通用户和攻击者很难窃取和使用您的密钥。
- OpenSSH sshd 服务器提供了两个额外的选项来防止密钥滥用。首先,确保禁用 root 登录(PermitRootLogin yes )。其次,通过添加AuthorizedKeysFile %h/.ssh/authorized_keys_FileName指定允许使用服务器上的哪些用户帐户进行身份验证。有关更多详细信息,请参阅 sshd_config 手册页。