安全外壳协议(Secure Shell,SSH)是目前应用较多的一个网络安全协议。它为网络上传输的数据提供机密性、完整性、认证性等安全服务。
最近在研究git服务器,要使用ssh协议,需要搭架ssh服务器,这是第一次搭架,做下笔记,以供参考,以下是我的应用环境:
C/S |
操作系统 |
软件 |
IP地址 |
SSH服务端 |
Linux(debian) |
OpenSSH |
192.168.1.101 |
SSH客户端 |
Windows XP |
Copssh |
192.168.1.100 |
ssh客户端有很多选择,可以到这里看看:
http://en.wikipedia.org/wiki/Comparison_of_SSH_clients
◆如果要下载源码安装,可以到以下几个链接下载:
官网:http://www.openssh.com/
下载:http://www.openssh.com/openbsd.html
◆我选择直接从软件包安装:
#apt-get install ssh
以上命令安装同时安装了openssh-server和openssh-client,你也可以有选择性的安装:
#apt-get install openssh-server
#apt-get install openssh-client
安装完后应该会自动运行ssh服务,可以通过以下指令确认:
#ps aux|grep ssh
官网:https://www.itefix.no/i2/copssh
安装过程很简单,一直“下一步”即可。
SSH提供了两种认证方式:口令认证和密钥认证。在Windows XP安装完CopSSH后,在开始菜单 > CopSSH > 03. Start a Unix BASH Shell启动Shell窗口,在这里就可以使用ssh命令。
用服务器上的root身份登陆:
第一次登陆时,会提示无法创建/home/Administrator/.ssh目录,你可以用以下命令创建该目录:
$ mkdir –p /home/Administrator/.ssh |
同时,你第一次登录某一个远程主机时,会出现没有找到远程主机密钥的提示信息。输入"yes"后,系统会将远程主机的密钥加入到你的主目录下的/home/Administrator/.ssh/known_hosts文件中。以后登录就不会再提示了,直接输入服务器账号root的密码即可登录。
登陆后,你就可以远程操作服务器了,要登出,用exit或者logout命令。
要保证.ssh和authorized_keys都只有用户自己有写权限,否则验证无效。(今天就是遇到这个问题,找了好久问题所在),其实仔细想想,这样做是为了不会出现系统漏洞。
基于口令的认证,需要在用户每次登录的时候都输入用户名和口令,显得比较麻烦。而基于公共密钥的认证,只需要在第一次输入密钥口令,就可以不需要再次输入,一次分发密钥后,验证将由程序自动进行,且安全性比基于口令方式更强。
SSH双方,通过相应帐号主目录下的.ssh目录中的客户端密钥对id_rsa、id_rsa.pub文件和服务端authorized_keys文件中密钥进行验证。
id_rsa |
自己的rsa私钥 |
id_rsa_pub |
自己的rsa公钥 |
authorized_keys |
存放rsa客户端的公钥 |
◆客户端向ssh服务器发出连接请求,请求用密匙进行安全验证,该请求包含请求的帐号和自己的公钥。
◆ssh服务器收到请求后,先在服务器的用户目录下对应帐号目录中寻找你的公用密钥(如/root/.ssh/authorized_keys文件中),如果找到的公钥与客户端发来的公钥一致,则开始进行下一步“质询”。
◆服务器用该公钥加密“质询”(challenge)信息,并发送绐客户端。
◆客户端收到加密的质询信息后,用自己的密钥对其解密,并将解密后的信息发送回服务器。
◆服务器验证客户端返回的质询信息正确后,验证结束,双方开始通信。
在客户端用以下指令生成密钥对文件(补充:后来发现最好是用ssh-keygen -t rsa,有次我在CentOS系统上运行ssh-keygen产生的密钥对就不是rsa的):
之后将生成的id_rsa.pub文件内容附加到服务器对应帐号下的authorized_keys文件末尾即可,如果没有该文件则新建一个,如:/root/.ssh/authorized_keys。有以下两种操作方法:
◆远程操作
$ ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected] |
在CopSSH的Shell中没法用ssh-copy-i命令,如果客户端是安装在linux就可以用该命令了。
◆文件拷贝到服务器上操作
先在客户端用scp命令将文件拷贝到远程服务器:
然后登陆到服务器,在服务器上操作,将文件id_rsa.pub追加到authorized_keys文件中。操作如下:
按以上任一方法配置,以后登陆就无需输入密码,如下图所示:
实际应用中,可能同时需要多套公钥/私钥对。在使用ssh-keygen命令时需要通过-f参数指定不同的私钥名称。用法如下:
$ ssh-keygen -f ~/.ssh/<filename> |
指定有意义的<filename>名称,命令执行后,会在~/.ssh目录下创建指定的公钥/私钥对:文件<filename>是私钥,文件<filename.pub>是公钥。
将新生的公钥追加到服务器主机登陆用户主名录下的.ssh/authorized_keys文件中,就可以使用新创建的公钥建立到远程主机<server>的<user>账户的无口令登陆。
现在客服端存在多个公钥/私钥对,那么当执行下面的ssh登陆指令时,用到的是哪个公钥呢?
$ ssh <user>@<server> |
当然是默认公钥~/.ssh/id_rsa.pub。那么如何用新建的公钥连接server呢?
SSH的客户端配置文件~/.ssh/config可以通过创建主机别名,在连接主机时选择使用特定的公钥。例如~/.ssh/config文件中的下列配置:
host hr user root hostname 192.168.1.101 port 22 identityfile ~/.ssh/id_rsa
host hj user root hostname 192.168.1.101 port 22 identityfile ~/.ssh/jiajia |
可以使用下面的SSH登陆命令,
$ ssh hr // 相当于用私钥id_rsa文件登陆[email protected]服务器 $ ssh hj // 相当于用私钥jiajia文件登陆[email protected]服务器 |