深度解析Linux SSH

SSH全称Secure SHell,顾名思义就是非常安全的shell的意思,SH的主要目的是用来取代传统的telnet和R系列命令(rlogin,rsh,rexec等)远程登陆和远程执行命令的工具,实现对远程登陆和远程执行命令加密。防止由于网络监听而出现的密码泄漏,对系统构成威胁。
在出现SSH之前,系统管理员需要登入远程服务器执行系统管理任务时,都是用telnet来实现的,telnet协议采用明文密码传送,在传送过程中对数据也不加密,很容易被不怀好意的人在网络上监听到密码。同样,在SSH工具出现之前R系列命令也很流行(由于这些命令都以字母r开头,故把这些命令合称为R系列命令R是remote的意思),比如rexec是用来执行远程服务器上的命令的,和telnet的区别是telnet需要先登陆远程服务器再实行相关的命令,而R系列命令可以把登陆和执行命令并登出系统的操作整合在一起。这样就不需要为在远程服务器上执行一个命令而特地登陆服务器了。
SSH是一种加密协议,不仅在登陆过程中对密码进行加密传送,而且对登陆后执行的命令的数据也进行加密,这样即使别人在网络上监听并截获了你的数据包,他也看不到其中的内容。

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远程登录:

SSH最常用的使用方式是代替telnet进行远程登陆。不同于telnet的密码登陆,SSH还同时支持多种登入方式,不像telnet那样只有输入系统密码一种途径。而目前最常用的登陆方式还是传统的Password方式和Publickey方式登陆。下面以ubuntu为例,举例说明这两种登陆方式的用法。
[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文件内),然后输入密码即可连接对方主机。
现在我们解释一下对称加密和非对称加密
对称加密,或专用密钥(也称做常规加密)由通信双方共享一个秘密密钥。
非对称加密,当发送信息时, 发送方使用接收方的公钥对数据加密,而接收方则使用自己的私钥解密,
这样,信息就可以安全无误地到达目的地了,即使被第三方截获,由于没有相应的私钥,
也无法进行解密。通过数字的手段保证加密过程是一个不可逆过程,即只有用私有密钥才能解密。
深度解析Linux SSH_第1张图片
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 126 22:54 bin
    drwxr-xr-x   4 root root  4096 1220 22:34 boot
    drwxr-xr-x   2 root root  4096 124 23:39 cdrom
    drwxr-xr-x  18 root root  4420  26 19:30 dev
    drwxr-xr-x 154 root root 12288  26 19:30 etc
    drwxr-xr-x   3 root root  4096 124 23:39 home

输入正确的密码后,ssh会链接远程服务器的sshd服务器程序,然后执行远程服务器上的
ls –l / 命令 ,并把输入结果传到本地服务器。相当于你先登陆到远程服务器,然后再实行命令ls –l /,最后再登出服务器。需要提醒的是,如果你需要登陆服务器并执行不止一个命令,必须要把命令用单引号或双引号引起来:

ssh 172.18.6.227cd /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”。

申请云服务器时使用云服务器提供的私钥文件登录:
深度解析Linux SSH_第2张图片

1. chmod 400 私钥文件                        #将您的私钥文件设置权限为400
2. ssh -i 私钥文件 系统管理员@服务器IP     
例:ssh -i ~/test   root@203.111.111.111     
#私钥文件路径为~/test,用户名为ubuntu,服务IP为203.111.111.111

你可能感兴趣的:(linux)