前言

本文基于实际Linux管理工作,实例讲解工作中使用ssh证书登录的实际流程,讲解ssh证书登录的配置原理,基于配置原理,解决实际工作中,windows下使用SecureCRT证书登录的各种问题,以及实现hadoop集群部署要求的无密码跳转问题。
ssh有密码登录和证书登录,初学者都喜欢用密码登录,甚至是root账户登录,密码是123456。但是在实际工作中,尤其是互联网公司,基本都是证书登录的。内网的机器有可能是通过密码登录的,但在外网的机器,如果是密码登录,很容易受到攻击,真正的生产环境中,ssh登录都是证书登录。

证书登录的步骤

1.客户端生成证书:
私钥和公钥,然后私钥放在客户端,妥当保存,一般为了安全,访问有黑客拷贝客户端的私钥,客户端在生成私钥时,会设置一个密码,以后每次登录ssh服务器时,客户端都要输入密码解开私钥(如果工作中,你使用了一个没有密码的私钥,有一天服务器被黑了,你是跳到黄河都洗不清)。

2.服务器添加信用公钥:
把客户端生成的公钥,上传到ssh服务器,添加到指定的文件中,这样,就完成ssh证书登录的配置了。
假设客户端想通过私钥要登录其他ssh服务器,同理,可以把公钥上传到其他ssh服务器。
真实的工作中:员工生成好私钥和公钥(千万要记得设置私钥密码),然后把公钥发给运维人员,运维人员会登记你的公钥,为你开通一台或者多台服务器的权限,然后员工就可以通过一个私钥,登录他有权限的服务器做系统维护等工作,所以,员工是有责任保护他的私钥的,如果被别人恶意拷贝,你又没有设置私钥密码,那么,服务器就全完了,员工也可以放长假了。

3.客户端建立私钥和公钥
在客户端终端运行命令

$ ssh-keygen -t rsa -C 'liuj@jretec.com' [-P '']  //-P后面的空格是指私钥不需要密码

rsa是一种密码算法,还有一种是dsa,证书登录常用的是rsa。
假设用户是blue,执行 ssh-keygen 时,才会在我的home目录底下的 .ssh/ 这个目录里面产生所需要的两把 Keys ,分别是私钥 (id_rsa) 与公钥 (id_rsa.pub)。
另外就是私钥的密码了,如果不是测试,不是要求无密码ssh,那么对于passphrase,不能输入空(直接回车),要妥当想一个有特殊字符的密码。

4.ssh服务端配置
ssh服务器配置如下:

$ vim /etc/ssh/sshd_config
#-------------------------------------------------------------
#找到Port 22,将前面的#字符去掉,然后在其下添加端口2016(一般高于 2000 而不能超过 65555)
Port 22
Port 2016

提示:之所以先设置成两个端口,测试成功后再关闭一个端口,是为了方式在修改conf的过程中,万一出现掉线、断网、误操作等未知情况时候,还能通过另外一个端口连接上去调试以免发生连接不上必须派人去机房,导致问题更加复杂麻烦。
特别注意:这里修改端口后重启 sshd 服务之后原来的 22 端口就不能连接了,所以在开启了防火墙(比如 CentOS 中的 iptables 或 FirewallD)的情况下,一定要把新端口添加了允许访问的列表里,免得将自己锁在了服务器外面!

iptables的添加方法

任意执行一条iptables的防火墙配置规则指令

$ sudo iptables -A INPUT -p tcp --dport 2017 -j ACCEPT
对iptables配置进行保存
$ sudo service iptables save
重启 iptables服务器
$ sudo service iptables restart
重启sshd服务
$ sudo /etc/init.d/sshd restart

防火墙iptables文档的配置参考

查看iptables规则文件

$ cat /etc/sysconfig/iptables

编辑防火墙配置:

$ sudo vim /etc/sysconfig/iptables
添加如下内容:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2018 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 873 -j ACCEPT
启用端口:
$ sudo /etc/init.d/iptables restart
或
重启iptables服务
$ sudo service iptables restart
重启sshd服务
$ sudo /etc/init.d/sshd restart

查看iptables规则

$ iptables -L -n
#查看已打开的端口(若nmap未安装, sudo yum install -y nmap)
$ nmap localhost
••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
#保存iptables规则
$ sudo service iptables save
#重启iptables服务
$ sudo service iptables restart
••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
#禁用root账户登录,非必要,但为了安全性,请配置
PermitRootLogin no
# 是否让 sshd 去检查用户家目录或相关档案的权限数据,
# 这是为了担心使用者将某些重要档案的权限设错,可能会导致一些问题所致。
# 例如使用者的 ~/.ssh/ 权限设错时,某些特殊情况下会不许用户登入
StrictModes no
# 是否允许用户自行使用成对的密钥系统进行登入行为,仅针对 version 2。
# 至于自制的公钥数据就放置于用户家目录下的 .ssh/authorized_keys 内
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile   .ssh/authorized_keys

#有了证书登录了,就禁用密码登录吧,安全要紧(建议上传证书后再进行操作)
PasswordAuthentication no

配置好ssh服务器的配置了,那么我们就要把客户端的公钥上传到服务器端,然后把客户端的公钥添加到authorized_keys

5.在客户端执行命令
测试ssh连接

$ ssh -p 2018 jacklau@192.168.3.71  # 注意是小写字母p

将公钥复制到服务器端
$ scp -P 2018 ~/.ssh/id_rsa.pub jacklau@192.168.3.71:~  # 注意是大写字母P
#………………………………………………………………………………………………………………………………………………
scp 命令基本格式:
scp [-P 选择端口] file_source file_target
从本地复制到远程
复制文件:
scp local_file remote_username@remote_ip:remote_folder
复制目录:
scp -r local_folder remote_username@remote_ip:remote_folder
#………………………………………………………………………………………………………………………………………………

6.在服务端执行命令

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

更改authorized_keys属性
$ chmod 600 authorized_keys

如果有修改配置/etc/ssh/sshd_config,需要重启ssh服务器
$ sudo /etc/init.d/ssh restart
或
$ sudo service sshd restart

客户端通过私钥登录ssh服务器
ssh命令
$ ssh -P 2016 -i /Users/jacklau/.ssh/id_rsa jacklau@192.168.3.71
scp命令
$ scp -P 2016 -i /Users/jacklau/.ssh/id_rsa filename jacklau@192.168.3.71:~
每次敲命令,都要指定私钥,是一个很繁琐的事情,所以我们可以把私钥的路径加入ssh客户端的默认配置里

修改/etc/ssh/ssh_config
#其实默认id_rsa就已经加入私钥的路径了,这里只是示例而已
IdentityFile ~/.ssh/id_rsa
#如果有其他的私钥,还要再加入其他私钥的路径
IdentityFile ~/.ssh/jacklau_rsa

其他应用场景

SecureCRT密钥key连接远程ssh证书登录Linux
国内大部分人用的系统是windows,而windows下有很多ssh客户端图形工具,最流行,功能最强大的就是SecureCRT了,所以我会单独针对SecureCRT简单讲下实现ssh证书登录Linux的要点,步骤如下:
1:在SecureCRT创建私钥和公钥:主菜单->工具->创建公钥->选择RSA->填写私钥的密码->密钥长度填为1024->点击完成,生成两个文件,默认名为identity和identity.pub
2.把私钥和公钥转换为OpenSSH格式:主菜单->工具->转换私钥到OpenSSH格式->选择刚生成私钥文件identity->输入私钥的密码->生成两个文件,指定为id_rsa,id_rsa.pub
3.把公钥id_rsa.pub上传到ssh服务器,按照之前配置服务器端的证书,再配置一次。
另外,如果你之前用windows的 SecureCRT的证书登录linux的,有一天你换成了linux,并希望通过原来的私钥登录公司的服务器,那么可以把id_rsa拷贝倒~/.ssh/目录下,配置ssh客户端参考上文。

备注:
ssh对证书的文件和目录权限比较敏感,要么根据出错提示设置好文件和目录权限,要么是把StrictModes选项设置为no

hadoop部署的无密码ssh登录
hadoop要求master要无密码跳转到每个slave,那么master就是上文中的ssh客户端了,步骤如下:
在hadoop master上,生成公钥私钥,这个场景下,私钥不能设置密码。
把公钥上传到每个slave上指定的目录,这样就完成了ssh的无密码跳转了。

私钥产生公钥命令

ssh-keygen -y -f id_rsa.pem > public_key.pub

SSH无密码登录拉取远程git资源

初始化环境:

$ git init

设置git全局变量:

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

创建SSH Key
在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳过。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:

$ ssh-keygen -t rsa -P '' -C "youremail@example.com"

登陆GitHub,打开"Account settings","SSH Keys"页面:
然后,点"Add SSH Key",填上任意Title,在Key文本框里粘贴
id_rsa.pub 文件的内容

$ cat ~/.ssh/id_rsa.pub

验证是否配置成功
使用命令 :

ssh -T git@bitbucket.org

验证遇到的问题:
ssh出错 sign_and_send_pubkey: signing failed: agent refused operation
Posted on2016-05-26
在服务器添加完公钥之后,ssh服务器报了这个错误
sign_and_send_pubkey: signing failed: agent refused operation
然后执行了以下命令才好:

> eval "$(ssh-agent -s)"
> ssh-add

标签: SSH

添加新评论