钥匙串:在Linux上为备份脚本设置安全的无密码SSH访问

时间:2020-01-09 10:43:44  来源:igfitidea点击:

我们建立与远程系统的连接而无需提供密码。
但是,我不想将我的无密码密钥(无密码短语的密钥)存储在服务器上。

ssh-agent使用密码来处理密钥,这使我可以轻松地在每个登录会话的每个系统上使用ssh-agent进程。
如何显着减少将密码短语打孔的次数从每个新的登录会话一次减少到每次重新启动本地服务器一次?
如何为所有备份脚本使用钥匙串实用程序,以实现安全的无密码登录?

OpenSSH无需提供密码即可向远程系统提供RSA和DSA身份验证。

keychain是一种特殊的bash脚本,旨在使基于密钥的身份验证变得异常便捷和灵活。
与无密码密钥相比,它具有各种安全优势。

钥匙串如何使它比无钥匙密码更好?

如果攻击者设法使用无密码的密钥登录服务器,则使用密钥的其他所有服务器/工作站也都存在安全风险。
使用钥匙串或者ssh-agent,攻击者将无法在不破坏密码的情况下接触您的远程系统。
再举一个例子,如果您的笔记本电脑或者硬盘被盗,攻击者可以简单地将您的密钥复制并在任何地方使用,因为密码短语不能保护您的密钥。

钥匙串充当ssh-agent的管理器,通常从~/.bash_profile运行。
它允许您的shell和cron作业共享一个ssh-agent进程。
默认情况下,即使您已经退出系统,由钥匙串启动的ssh-agent也会长时间运行,并且将继续运行。
如果要更改此行为,请查看下面的--clear--timeout选项。
我们的示例设置如下:

`peerbox.theitroad.com` -  Remote Backup Server. Works in pull only mode. It will backup server1.theitroad.com and server2.theitroad.com.
`Hyman-desktop.theitroad.com` -  My desktop computer.
`server1.theitroad.com` -  General purpose remote server.
`server2.theitroad.com` -  General purpose remote web / mail / proxy server.

您需要在peerbox.theitroad.com上安装钥匙串软件,以便您或者脚本可以安全地登录到其他两台服务器进行备份。

在CentOS/RHEL/Fedora Linux上安装钥匙串

RHEL/CentOS Linux用户执行以下命令,首先启用psychotic存储库并在CentOS 7.x上安装钥匙串软件包:

##[*** 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

在提示时分配密码。
有关详细信息,请参见以下分步指南:

  • Howto 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配置为在每次登录时调用钥匙串工具。
只需注销并从桌面重新登录到服务器即可测试设置:

$ ssh [email protected]

keyhcain已启动并正在运行。
现在,您要做的就是将服务器密钥文件$HOME/.ssh/id_dsa.pub追加到其他UNIX/Linux/BSD框中:

# scp $HOME/.ssh/id_dsa.pub server1.theitroad.com:~/pubkey
# scp $HOME/.ssh/id_dsa.pub server2.theitroad.com:~/pubkey
# ssh server1.theitroad.com cat ~/pubkey >> ~/.ssh/authorized_keys2; rm ~/pubkey
# ssh server2.theitroad.com cat ~/pubkey >> ~/.ssh/authorized_keys2; rm ~/pubkey
# ssh [email protected]
# ssh [email protected]

清除或者删除所有ssh-agents密钥

# keychain --clear

安全确保入侵者无法使用您现有的ssh-agents密钥(仅允许cron作业使用少密码登录)

这个想法很简单,只允许备份Shell脚本和其他cron作业允许无密码登录,但是包括入侵者在内的所有用户都必须提供用于交互式登录的密码密钥。
通过删除所有ssh-agents密钥来完成此操作。
此选项将提高安全性,并且仍然允许您的cron作业在注销时使用ssh密钥。
如下更新~/.bash_profile:

/usr/bin/keychain --clear $HOME/.ssh/id_dsa

如果使用RSA,请使用:

/usr/bin/keychain --clear $HOME/.ssh/id_rsa

现在,只需登录一次远程服务器框:

$ ssh [email protected]

注销(仅授予对cron作业的访问权限,例如备份)

# logout

将钥匙串与备份脚本一起使用,以通过cron作业进行无密码登录

在rsync,ssh上的tar或者任何其他网络备份命令之前添加以下内容:

source $HOME/.keychain/$HOSTNAME-sh

这是一个示例rsync脚本:

#!/bin/bash
# Remote Server Rsync backup Replication Shell Script
# Local dir location
LOCALBAKPOINT=/iscsi
LOCALBAKDIR=/backups/server1.theitroad.com/wwwroot
# Remote ssh server setup
SSHUER=root
SSHSERVER=server1.theitroad.com
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!'

如果您使用的是rsnaphot备份服务器(请参阅如何设置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手册页。