1.SSH的安装:
OpenSSH已经是目前大多数linux和BSD操作系统(甚至cygwin)的标准组件.但如果你的系统尚未安装OpenSSH,则使用如下命令安装:
//对于ubuntu
sudo apt-get install openssh-server
//对于centos
yum install openssh-server
2.OpenSSH包含的命令:
sshd ―― SSH服务端程序
sftp-server ―― SFTP服务端程序(类似FTP但提供数据加密的一种协议)
scp ―― 非交互式sftp-server的客户端,用来向服务器上传/下载文件
sftp ―― 交互式sftp-server客户端,用法和ftp命令一样。
slogin ―― ssh的别名
ssh ―― SSH协议的客户端程序,用来登入远程系统或远程执行命令
ssh-add ―― SSH代理相关程序,用来向SSH代理添加dsa key
ssh-agent ―― ssh代理程序
ssh-keyscan ―― ssh public key 生成器
3.SSH远程登录:
[root@hadoop ~]# ssh [email protected]
The authenticity of host ’ 172.0.0.1 ( 172.0.0.1)’ can’t be established.
RSA key fingerprint is 43:80:f2:e1:9b:b6:6e:c0:e2:dd:57:8f:ed:89:b3:81.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ’ 172.0.0.1′ (RSA) to the list of known hosts.
root@ 172.0.0.1‘s password:
Last login: Thu Jul 12 18:47:47 2016 from 172.0.0.1
[root@hadoop ~]#
第一次登陆后,ssh就会把登陆的ssh指纹存放在用户home目录的.ssh目录的know_hosts文件中,如果远程系统重装过系统,ssh指纹已经改变,你需要把 .ssh 目录下的know_hosts中的相应指纹删除,再登陆回答yes,方可登陆。请注意.ssh目录是开头是”.”的隐藏目录,需要ls –a参数才能看到。而且这个目录的权限必须是700,并且用户的home目录也不能给其他用户写权限,否则ssh服务器会拒绝登陆。如果发生不能登陆的问题,请察看服务器上的日志文件/var/log/secure。通常能很快找到不能登陆的原因.
过程解析:
在使用ssh第一次连接时会要求你下载一个对方主机的公钥(非对称加密,此文件将写入到/~/.ssh的known_hosts文件内),然后输入密码即可连接对方主机。
现在我们解释一下对称加密和非对称加密
对称加密,或专用密钥(也称做常规加密)由通信双方共享一个秘密密钥。
非对称加密,当发送信息时, 发送方使用接收方的公钥对数据加密,而接收方则使用自己的私钥解密,
这样,信息就可以安全无误地到达目的地了,即使被第三方截获,由于没有相应的私钥,
也无法进行解密。通过数字的手段保证加密过程是一个不可逆过程,即只有用私有密钥才能解密。
4.ssh远程执行命令:
[root@hadoop ~]# ssh 172.0.0.1 ls -l /
root@172.0.0.1‘s password:
total 108
drwxr-xr-x 2 root root 4096 12月 6 22:54 bin
drwxr-xr-x 4 root root 4096 12月 20 22:34 boot
drwxr-xr-x 2 root root 4096 12月 4 23:39 cdrom
drwxr-xr-x 18 root root 4420 2月 6 19:30 dev
drwxr-xr-x 154 root root 12288 2月 6 19:30 etc
drwxr-xr-x 3 root root 4096 12月 4 23:39 home
输入正确的密码后,ssh会链接远程服务器的sshd服务器程序,然后执行远程服务器上的
ls –l /
命令 ,并把输入结果传到本地服务器。相当于你先登陆到远程服务器,然后再实行命令ls –l /,最后再登出服务器。需要提醒的是,如果你需要登陆服务器并执行不止一个命令,必须要把命令用单引号或双引号引起来:
ssh 172.18.6.227 “cd /root && ls “
ssh的远程实行命令的功能是用来代替原始的R系列命令的,在ssh出现之前系统管理员们不得不用rexec, rsh等不安全的远程执行命令工具来完成同样的操作。这个功能在管理大批机器的时候是非常有用的,比如我要重启10.0.0.0/24网段内所有的服务器,只要输入一条命令:
for i in $(seq 1 254) ; do ssh 10.0.0.${i} reboot ; done
就可以完成重启所有服务器的操作,也许你会说,这要虽然不需要再登陆每一台服务器了,但是还是要每次输入密码,多麻烦啊。别急,下面要讲的用ssh public key方式登陆就是要解决问题。
5.采用public key登录(SSH的免密码登录):
SSH无密码原理
Master(NameNode | JobTracker)作为客户端,要实现无密码公钥认证,连接到服务器Salve(DataNode | Tasktracker)上时,需要在Master上生成一个密钥对,包括一个公钥和一个私钥,而后将公钥复制到所有的Slave上。当Master通过SSH连接Salve时,Salve就会生成一个随机数并用Master的公钥对随机数进行加密,并发送给Master。Master收到加密数之后再用私钥解密,并将解密数回传给Slave,Slave确认解密数无误之后就允许Master进行连接了。这就是一个公钥认证过程,其间不需要用户手工输入密码。
openssh的ssh-keygen命令用来产生这样的私钥和公钥:
ssh-keygen -b 1024 -t rsa -C wangxi@163.com//然后一直按回车即可
Generating public/private dsa key pair.
//提示正在生成,如果选择4096长度,可能需要较长时间
Enter file in which to save the key (/root/.ssh/id_dsa):
//询问把公钥和私钥放在那里,回车用默认位置即可
Enter passphrase (empty for no passphrase):
//询问输入私钥密语,为了实现自动登陆,应该不要密语,直接回车
Enter same passphrase again:
//再次提示输入密语,再次直接回车
Your identification has been saved in /root/.ssh/id_dsa.
Your public key has been saved in /root/.ssh/id_dsa.pub.
//提示公钥和私钥已经存放在/root/.ssh/目录下
The key fingerprint is:
71:e5:cb:15:d3:8c:05:ed:05:84:85:32:ce:b1:31:ce [email protected]
//提示key的指纹
说明:
-b 1024 采用长度为1024字节的公钥/私钥对,最长4096字节,一般1024或2048就可以了,太长的话加密解密需要的时间也长。
-t rsa 采用rsa加密方式的公钥/私钥对,除了rsa还有dsa方式,rsa方式最短不能小于768字节长度。
-C [email protected]对这个公钥/私钥对的一个注释和说明,一般用所有人的邮件代替。可以省略不写,更多其他参数请man ssh-keygen。
最简单的方法是: ssh-keygen -t rsa 然后一直回车
[root@hadoop ~]# ls -l /root/.ssh
total 16
-rw——- 1 root root 668 Jul 12 20:07 id_dsa
-rw-r–r– 1 root root 611 Jul 12 20:07 id_dsa.pub
-rw-r–r– 1 root root 222 Jul 12 19:37 known_hosts
产生的公钥/私钥文件在用户home目录的.ssh目录下,其中id_dsa.pub是公钥,把产生的公钥上传到需要登陆的服务器的对应用户目录的home目录的.ssh目录下,再一次强调用户自己的目录(home目录)必须不能有其他人可写的权限,.ssh目录的权限必须是700,即除了用户自己,其他人没有任何读写察看该目录的权限,否则ssh服务器会拒绝登陆。ssh默认的公钥文件是用户home目录下的.ssh目录下的authorized_keys文件,因此需要把产生的公钥以这个文件名放到服务器的/root/.ssh/目录下,这个文件中可以存放多个客户端的公钥文件,就好比一个大门上可以上很多锁,可以有不同的钥匙来尝试开锁,只要有一个锁被打开了,门就可以打开了。私钥必须是600权限,否则ssh服务器会拒绝用户登陆。
(通俗的说就是把公钥id_rsa.pub复制到你想要免密码登陆的主机的~/.ssh/文件夹下,然后在将其内容追加到 authorized_keys
A想免密码登陆到B。把id_rsa.pub复制到B的~/.ssh/下,然后将其追加到B的~/.ssh/autorized_keys下,如果没有就创建,则A可免密码登陆B)
要注意请务必要将服务器上
~/.ssh权限设置为700
~/.ssh/authorized_keys的权限设置为600
这是linux的安全要求,如果权限不对,自动登录将不会生效
6./etc/ssh/ssh_config 和 /etc/ssh/sshd_config的配置
/etc/ssh/ssh_config:
Host *
选项“Host”只对能够匹配后面字串的计算机有效。“*”表示所有的计算机。
ForwardAgent no
“ForwardAgent”设置连接是否经过验证代理(如果存在)转发给远程计算机。
ForwardX11 no
“ForwardX11”设置X11连接是否被自动重定向到安全的通道和显示集(DISPLAY set)。
RhostsAuthentication no
“RhostsAuthentication”设置是否使用基于rhosts的安全验证。
RhostsRSAAuthentication no
“RhostsRSAAuthentication”设置是否使用用RSA算法的基于rhosts的安全验证。
RSAAuthentication yes
“RSAAuthentication”设置是否使用RSA算法进行安全验证。
PasswordAuthentication yes
“PasswordAuthentication”设置是否使用口令验证。
FallBackToRsh no
“FallBackToRsh”设置如果用ssh连接出现错误是否自动使用rsh。
UseRsh no
“UseRsh”设置是否在这台计算机上使用“rlogin/rsh”。
BatchMode no
“BatchMode”如果设为“yes”,passphrase/password(交互式输入口令)的提示将被禁止。当不能交互式输入口令的时候,这个选项对脚本文件和批处理任务十分有用。
CheckHostIP yes
“CheckHostIP”设置ssh是否查看连接到服务器的主机的IP地址以防止DNS欺骗。建议设置为“yes”。
StrictHostKeyChecking no
“StrictHostKeyChecking”如果设置成“yes”,ssh就不会自动把计算机的密匙加入“$HOME/.ssh/known_hosts”文件,并且一旦计算机的密匙发生了变化,就拒绝连接。
IdentityFile ~/.ssh/identity
“IdentityFile”设置从哪个文件读取用户的RSA安全验证标识。
Port 22
“Port”设置连接到远程主机的端口。
Cipher blowfish
“Cipher”设置加密用的密码。
EscapeChar ~
“EscapeChar”设置escape字符。
/etc/ssh/sshd_config:
Port 22
“Port”设置sshd监听的端口号。
ListenAddress 192.168.1.1
“ListenAddress”设置sshd服务器绑定的IP地址。
HostKey /etc/ssh/ssh_host_key
“HostKey”设置包含计算机私人密匙的文件。
ServerKeyBits 1024
“ServerKeyBits”定义服务器密匙的位数。
LoginGraceTime 600
“LoginGraceTime”设置如果用户不能成功登录,在切断连接之前服务器需要等待的时间(以秒为单位)。
KeyRegenerationInterval 3600
“KeyRegenerationInterval”设置在多少秒之后自动重新生成服务器的密匙(如果使用密匙)。重新生成密匙是为了防止用盗用的密匙解密被截获的信息。
PermitRootLogin no
“PermitRootLogin”设置root能不能用ssh登录。这个选项一定不要设成“yes”。
IgnoreRhosts yes
“IgnoreRhosts”设置验证的时候是否使用“rhosts”和“shosts”文件。
IgnoreUserKnownHosts yes
“IgnoreUserKnownHosts”设置ssh daemon是否在进行RhostsRSAAuthentication安全验证的时候忽略用户的“$HOME/.ssh/known_hosts”
StrictModes yes
“StrictModes”设置ssh在接收登录请求之前是否检查用户家目录和rhosts文件的权限和所有权。这通常是必要的,因为新手经常会把自己的目录和文件设成任何人都有写权限。
X11Forwarding no
“X11Forwarding”设置是否允许X11转发。
PrintMotd yes
“PrintMotd”设置sshd是否在用户登录的时候显示“/etc/motd”中的信息。
SyslogFacility AUTH
“SyslogFacility”设置在记录来自sshd的消息的时候,是否给出“facility code”。
LogLevel INFO
“LogLevel”设置记录sshd日志消息的层次。INFO是一个好的选择。查看sshd的man帮助页,已获取更多的信息。
RhostsAuthentication no
“RhostsAuthentication”设置只用rhosts或“/etc/hosts.equiv”进行安全验证是否已经足够了。
RhostsRSAAuthentication no
“RhostsRSA”设置是否允许用rhosts或“/etc/hosts.equiv”加上RSA进行安全验证。
RSAAuthentication yes
“RSAAuthentication”设置是否允许只有RSA安全验证。
PasswordAuthentication yes
“PasswordAuthentication”设置是否允许口令验证。
PermitEmptyPasswords no
“PermitEmptyPasswords”设置是否允许用口令为空的帐号登录。
AllowUsers admin
“AllowUsers”的后面可以跟着任意的数量的用户名的匹配串(patterns)或user@host这样的匹配串,这些字符串用空格隔开。主机名可以是DNS名或IP地址。
SSH登录过程中的常见问题:
SSH 登录是错误:Permission denied (publickey,gssapi-with-mic)
解决方法:
/etc/ssh/sshd_config 中的”PasswordAuthentication”参数值为”no”,修改回”yes”,重启sshd服务即可。然后root登录进去之后创建一个其他用户名,并再次把/etc/ssh/sshd_config 中的”PasswordAuthentication”参数值改为”no”。
1. chmod 400 私钥文件 #将您的私钥文件设置权限为400
2. ssh -i 私钥文件 系统管理员@服务器IP
例:ssh -i ~/test root@203.111.111.111
#私钥文件路径为~/test,用户名为ubuntu,服务IP为203.111.111.111