ssh环境搭建与管理 (详解)

实验环境

服务端:xuegod-63   IP192.168.1.63

客户端:xuegod-64   IP192.168.1.64

   客户端普通用户:ceshi  密码:123456

安装好扫描软件rpm -ivh /mnt/Packages/nmap-5.21-4.el6.x86_64.rpm

实验目标

1SSHD服务介绍

2SSHD服务安装配置

3:两Linux服务器之间数据拷贝

4SSHD服务作用:

实验步骤

1:搭建环境

1):网桥模式

2):vmtools安装完毕

3):yum源配置完毕

4):nmap安装完毕

5):添加用户完毕

2:实验脚本

第一块:sshd简述与登录应用

SSHD服务简述

SSH 协议:安全外壳协议。为 Secure Shell 的缩写。SSH 为建立在应用层和传输层基础上的安全协议。

sshd服务使用SSH协议可以用来进行远程控制, 或在计算机之间传送文件。

而实现此功能的传统方式,如telnet(终端仿真协议)都是极为不安全的,并且会使用明文传送密码。

OpenSSH软件包,提供了服务端后台程序和客户端工具,用来加密远程控件和文件传输过程中的数据,并由此来代替原来的类似服务。

 

Ssh的标准端口

[root@xuegod-63 ~]# vim /etc/services

wKiom1g-bi3SPZTBAAAbaSendGM116.png 

 

查看一下ssh的包

[root@xuegod-63 Packages]# ls openssh*

openssh-5.3p1-70.el6.x86_64.rpm  #核心文件包

openssh-askpass-5.3p1-70.el6.x86_64.rpm  #xshell用的包

openssh-clients-5.3p1-70.el6.x86_64.rpm  #客户端的包

openssh-server-5.3p1-70.el6.x86_64.rpm  #服务端的包

#这四个包是默认安装好的

 

查看一下包是否安装好

[root@xuegod-63 Packages]# rpm -qa | grep openssh

openssh-clients-5.3p1-70.el6.x86_64

openssh-server-5.3p1-70.el6.x86_64

openssh-5.3p1-70.el6.x86_64

openssh-askpass-5.3p1-70.el6.x86_64

#可以清楚的看到这四个包是默认安装好的,因此不需要我们去安装的,只需要我们去启动一下就OK

 

查看包的安装路径 - - - 这里是举例查看服务端的包

[root@xuegod-63 Packages]# rpm -pql openssh-server-5.3p1-70.el6.x86_64.rpm

/etc/rc.d/init.d/sshd  #ssh服务端的启动路径

/etc/ssh/sshd_config  #ssh服务端的配置文件路径

注:

OpenSSH 常用配置文件有两个/etc/ssh/ssh_config /etc/ssh/sshd_config

ssh_config 为客户端配置文件

sshd_config 为服务器端配置文件

 

查看ssh的运行状态与关闭ssh服务运行

1:查看状态的2中方法

[root@xuegod-63 ~]# service sshd status

[root@xuegod-63 ~]# /etc/init.d/sshd status

#sshd的四个包默认情况下是安装好的,但是默认情况是关闭运行的

2:关闭ssh服务运行的两种方法

[root@xuegod-63 ~]# service sshd stop

[root@xuegod-63 ~]# /etc/init.d/sshd stop

 

启动服务的3种方法

[root@xuegod-63 Packages]# /etc/init.d/sshd start

[root@xuegod-63 Packages]# /etc/init.d/sshd restart

[root@xuegod-63 Packages]# service sshd restart

 

Ssh服务开机加载并查看启动级别

[root@xuegod-63 ~]# chkconfig sshd on

[root@xuegod-63 ~]# chkconfig --list sshd

sshd           0:关闭1:关闭2:启用3:启用4:启用5:启用6:关闭

 

第二块:修改配置文件,实战举例:

1:SSH运程登录:身份验证

 

1):Ssh命令参数

[root@xuegod-63 ~]# ssh

-f :需要配合后面的命令,可以不登陆远程主机就直接发送命令过去

-p:如果sshd服务启动在非标准端口,需要使用此参数

 

2):Ssh使用语法

Ssh+远程登录的用户名+@+远程登录的ip地址

 

3):以标准端口22,用root进程登录远程主机

wKiom1g-bjqg3DutAACZfXdV0js676.png 

#由于ssh后面没有加用户名,因此默认的是使用当前用户(即1.63上的root用户)来登陆远程服务器的,

在开头以RSA的哪行后面接的就是远程服务器(即1.64,客户端)的公钥指纹码,如果确认没有问题,那么你就需要输入yes来表示确认,将该指纹码写入到服务器公钥记录文件(~/etc/ssh/ssh_hosts_*)以便对比服务器的正确性,

RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。

现在由于远程服务器(即1.64客户端)的公钥文件已经被记录在本机1.63上了,因此在后面本机1.63在重复登录客户端的话,就不在需要指纹码验证了,

 

4):测试- - -加入用户名远程登录的两种方法

 

wKioL1g-bkiAL9tEAAAgw6Lb2sg148.png

wKioL1g-bkiBJ9GjAAAsdSn_qnA973.png


 

#由于加入了用户名,因此该主机1.63远程登录到客户端的普通用户“ceshi”下,并且,因为该主机1.63登陆过客户端1.64,所以再次登录的时候并没有出现客户端主机公钥的指纹码信息了。

 

5):以飞标准端口222登录远程主机

1:设置sshd 监听端口号

# SSH 预设使用 22 这个port,也可以使用多个port,即重复使用 port 这个设定项目! 

# 例如想要开放 sshd 端口为 22 222 ,则多加一行内容为: Port 222  即可

# 然后重新启动 sshd 这样就好了。 建议大家修改 port number 为其它端口。防止别人暴力破解。

 

2:查看端口

[root@xuegod-63 ~]# netstat -anutp | grep ssh

tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      15477/sshd          

tcp        0      0 :::22                       :::*                        LISTEN      15477/

#这里可以看到监听的端口是22

 

3:修改sshd服务默认监听的端口为22和222

[root@xuegod-63 ~]# vim /etc/ssh/sshd_config

wKiom1g-blbg7T5EAAAWcI5VPXo254.png 

4:重启服务

[root@xuegod-63 ~]# /etc/init.d/sshd restart

停止 sshd:                                                [确定]

正在启动 sshd:                                            [确定]

 

5:再次查看端口

[root@xuegod-63 ~]# netstat -anutp | grep ssh

tcp        0      0 0.0.0.0:222                 0.0.0.0:*                   LISTEN      16530/sshd          

tcp        0      0 :::222                      :::*                        LISTEN      16530/sshd          

#这里可以看到监听的是222端口

6:测试

wKioL1g-bmKwM_DbAAAVuwhHaOo159.png 

#可以看到,我们是没有登录进去的,告诉我们端口22,连接失败。

wKioL1g-bm3TE6VMAADEJKleBlc171.png 

#加“-p”以非端口的形式远程登录。

 

2:服务器公钥记录文件

 

在该主机1.63登录客户端1.64时,本机会主动利用客户端发过来的公钥信息去对比自己的~/etc/ssh/ssh_hosts_*下中有无客户端的公钥,然后进行下面的操作

1):若该主机1.63 ~/etc/ssh/ssh_hosts_*下没有记录客户端的公钥信息,则会询问该主机1.63是否需要记录远程客户端的公钥信息,即范例中回答 “yes”的哪一步。若要记录,则回答yes,表示记录,就会将客户端1.64的公钥信息记录在该主机1.63~/etc/ssh/ssh_hosts_下,且执行后续工作,如果不记录的话,则回答no即可,或者直接“ctrl+c”终端回话,并且退出登录工作。

2):若该主机1.63 ~/etc/ssh/ssh_hosts_*下有记录客户端的公钥信息,则会将客户端1.64发过来的公钥信息与自己的~/etc/ssh/ssh_hosts_下记录的公钥信息进行对比,如果相同,则继续进行登录工作,如果不相同的话,则会出现警告信息,并离开登录工作。这是客户端的自我保护功能,以避免你的服务器是被别人伪装的。

 

思考 

服务器ssh会经常变更,如果测试用的主机会经常重新安装,那么也就是说,测试主机记录的服务器的公钥信息肯定会不同,那就无法登陆了,这该怎么办呢?

解答:

由于远程服务器客户端的公钥信息是记录在服务端1.63~/etc/ssh/ssh_hosts下面的,那么我们只需要将原有的公钥信息给删除掉,在重新启动服务,再重新连接远程服务器并重新记录新的公钥信息不就OK了吗?

步骤

[root@xuegod-63 ~]# rm /etc/ssh/ssh_hosts*

[root@xuegod-63 ~]# /etc/init.d/sshd restart

 

 

第三块:虚拟机,添加一块网卡。让sshd服务器只在192.168.3.63 网络接口上监听

关机Linux机器,添加一块网卡。

 [root@xuegod-63 ~]# setup #生成配置eth1配置文件。

wKiom1g-boHyQKw_AABPgUvoCnY249.png

wKioL1g-boHBASM9AAAaFIaSksA486.png

wKioL1g-boKyroOfAACR_sh0jVg208.png

 

 

保存退出。

 

重启网络服务 

[root@xuegod-63 ~]# /etc/init.d/network restartwKioL1g-bpDRnxCWAAAywPg6vX4682.png

 

 

修改配置文件

[root@localhost network-scripts]# vim /etc/ssh/sshd_config

修改默认在哪个IP地址上监听:

改:

#ListenAddress 0.0.0.0

为:

ListenAddress 192.168.3.63

wKiom1g-bp-DUcSYAAAh3AlPYhw029.png 

 

重启sshd服务

Servcie sshd resatrt

 

测试

wKiom1g-bqrTYyaIAABE7boYE5I348.png 

#这个时候我们可以看到到,链接1.63是远程连接不上去的,而远程连接3.63是能够连接上去的,那么也就说明了限制一个ip地址登录是成功的

 

 

分享:

《黑客帝国:重装上阵》中的崔尼迪入侵电站的方法之SSH CRC-32漏洞

《【科技趣闻】《黑客帝国:重装上阵》中的崔尼迪入侵电站的方法》中,我们介绍了崔尼迪利用ssh的CRC-32漏洞将电站系统的Root密码更改,成功入侵了电站系统。现在来介绍一下这个SSH CRC-32漏洞。这个漏洞由于其年代久远,早已经失效。

详细描述 
SSH是一个远程访问加密协议,其中在CRC32补偿攻击探测代码中存在一个整数溢出可以允许远程攻击者写值到内存中的任意位置。 

# HostKey /etc/ssh/ssh_host_rsa_key # SSH version 2 使用的 RSA 私钥 

# HostKey /etc/ssh/ssh_host_dsa_key # SSH version 2 使用的 DSA 私钥 

# 还记得我们在主机的 SSH 联机流程里面谈到的,这里就是 Host Key

注:

RSA 是一种非对称加解密算法。

RSA 与 DSA 都是非对称加密算法。其中RSA的安全性是基于极其困难的大整数的分解(两个素数的乘积);

DSA 的安全性是基于整数有限域离散对数难题。基本上可以认为相同密钥长度的 RSA 算法与 DSA 算法安全性相当。

公钥用于加密,它是向所有人公开的;私钥用于解密,只有密文的接收者持有。

SyslogFacility AUTHPRIV

# 当有人使用 SSH 登入系统的时候,SSH 会记录信息,这个信息要记录的类型为AUTHPRIV

 

默认日志存放在哪?

sshd服务日志存放在: /var/log/secure

 

例: 为什么sshd配置文件中没有指定日志,但日志却存放在了: /var/log/secure 

[root@xuegod-63 ssh]# vim /etc/rsyslog.conf   查看:

AUTHPRIV

wKioL1g-breCTk2NAAAQh-7mzTE282.png 

安全设定项

 

# PermitRootLogin yes


#是否允许 root 登入!预设是允许的,但是建议改为no! 

PasswordAuthentication yes

# 密码验证当然是需要的!所以这里写 yes  

# PermitEmptyPasswords no

# 若上面那一项如果设定为 yes 的话,这一项就最好设定为 no  

# 这个项目在是否允许以空的密码登入!当然不许!

 

例: 使xshell可以让root密码为空的帐号登录。

LoginiGraceTme 2m       

# 当使用者连上 SSH server 之后,会出现输入密码的画面,在该画面中, 

# 在多久时间内没有成功连上 SSH server 就强迫断线!若无单位则默认时间为秒! 

例:

改:LoginGraceTime 2m 

 为:LoginGraceTime 5  ,重启后

Connection to 192.168.1.63 closed.

[root@xuegod64 ~]# ssh 192.168.1.63

root@192.168.1.63's password:

Connection closed by 192.168.1.63

 

 

第四块:通过密匙进行sshd服务认证

目标:实现服务端与客户端相互登录不需要密码,且可以互相拷贝文件

分析:在客户端上先生成一个密钥对,一个是公钥,一个是私钥,将公钥发给服务端。在发送的时候,客户端是需要输入服务端的密码的。

sshd服务端:xuegod-63

sshd客户端:xuegod-64

1):客户端生成密匙对: xuegod-64

使用root帐号登录后执行ssh-keygen 生成密匙。

[root@xuegod64 ~]# ssh-keygen  #一直按回车键

Generating public/private rsa key pair.

Enter file in which to save the key (/root/.ssh/id_rsa):

Enter passphrase (empty for no passphrase):

Enter same passphrase again:

Your identification has been saved in /root/.ssh/id_rsa.

Your public key has been saved in /root/.ssh/id_rsa.pub.

 

2):查看生成的配置文件 

[root@xuegod64 ~]# ls /root/.ssh/

id_rsa  id_rsa.pub  known_hosts

#id_rsa.pub  公钥信息

#id_rsa   秘钥信息

[root@xuegod64 ~]# cat /root/.ssh/id_rsa.pub  #查看公钥信息

ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEApTk+7QFrysm+oSVwiBF9C4GI8wDkH1IBdymA2U8po1fjAMc+mlNqQudZsXBwv6qXLE6URbaGfa8c+C6jJAFCY9Z9iRDpQh4IsQrgAryrZNZQdSk7PngTAYmXNA6B1FYfxKveZ7LREcXAo1FeYGSTYnrY8WEzdBzGa1YJbbpgkYW4a5wxijM7Z9yuD81Pzl4jLYea6UfCfeCe6iqSPJU2Gp2wuH2/4dTz9oKZkZrbP2MF+HNxemaiOTWofHc8+mdwUfTZGPwEGFim5GrxuB7aMvXMyzEyamsxst4JnlPjA7SZaqLyXs8j3FfV3wMEl0KfyW4ysee32RAoXTo1h7pgnQ== root@xuegod64

3):客户端发布公匙给服务端

使用ssh-copy-id 命令将客户端生成的公钥发布到远程服务器192.168.1.63 xuegod63.cn,并使用-i 参数指定本地公钥的存放位置。发送过去的默认地址就是存放秘钥地址,即:/root/.ssh/ 下面。

例:

[root@xuegod-64 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.1.63

root@192.168.1.63's password: 123456

Now try logging into the machine, with "ssh '192.168.1.63'", and check in:

[root@xuegod63 ~]# cat /root/.ssh/authorized_keys  #服务端查看客户端发来的公钥信息。

ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEApTk+7QFrysm+oSVwiBF9C4GI8wDkH1IBdymA2U8po1fjAMc+mlNqQudZsXBwv6qXLE6URbaGfa8c+C6jJAFCY9Z9iRDpQh4IsQrgAryrZNZQdSk7PngTAYmXNA6B1FYfxKveZ7LREcXAo1FeYGSTYnrY8WEzdBzGa1YJbbpgkYW4a5wxijM7Z9yuD81Pzl4jLYea6UfCfeCe6iqSPJU2Gp2wuH2/4dTz9oKZkZrbP2MF+HNxemaiOTWofHc8+mdwUfTZGPwEGFim5GrxuB7aMvXMyzEyamsxst4JnlPjA7SZaqLyXs8j3FfV3wMEl0KfyW4ysee32RAoXTo1h7pgnQ== root@xuegod64

4):测试连接远程服务器

[root@xuegod-64 ~]# ssh 192.168.1.63

Last login: Wed Aug  5 14:00:29 2015

[root@xuegod-63 ~]#    

#可以看到1.64客户端远程登录1.63服务端是不需要密码的!

[root@xuegod-63 ~]# ssh 192.168.1.64

root@192.168.1.65's password:

Last login: Sun Aug 23 13:27:52 2015 from 192.168.1.63

[root@xuegod-65 ~]#

#可以看到服务端1.63远程登录客户端1.64是需要密码的

 

注:这个时候就相当于客户端有自己的锁和服务端的钥匙,能够开启服务端,而服务端只有自己的锁,但是没有客户端的钥匙,因此无法远程登录连接客户端的

   这个时候只能是客户端不需要密码链接上服务端,而服务端是不能够不需要密码链接上客户端的 ,那么想要让两端互相都不需要密码就可以远程登录的话,方法有两种,一种是也在服务端生成密钥对,发送公钥给客户端。另一种就是客户端在即发送公钥给自己。方法如下。

5):1.64给自己发布秘钥

[root@xuegod-64 ~]# ssh-copy-id 192.168.1.64

root@192.168.1.64's password: 123456

Now try logging into the machine, with "ssh '192.168.1.64'", and check in:

#这个时候是1.64给自己生产一个秘钥

 

6):再给1.63发一个秘钥过去

[root@xuegod-64 ~]# scp /root/.ssh/id_rsa 192.168.1.63:/root/.ssh/id_rsa

id_rsa                                        100% 1675     1.6KB/s   00:00    

#1.64将自己生成的秘钥发给1.63服务端,这样服务端就相当于有了客户端的钥匙

 

7):测试

[root@xuegod-64 ~]# ssh 192.168.1.63

Last login: Sun Aug 23 12:56:47 2015 from 192.168.1.64

[root@xuegod-63 ~]# ssh 192.168.1.64

Last login: Sun Aug 23 12:54:03 2015 from 192.168.1.63

[root@xuegod-64 ~]#

#这个时候,服务端和客户端就可以相互登录且不需要任何密码了

 

 

第五块远程拷贝

1要把当前一个文件copy到远程另外一台主机上

 

1:将服务端1.63上拷贝passwd到客户端1.64的tmp目录下

[root@xuegod-63 ~]# scp /etc/passwd root@192.168.1.64:/tmp

passwd                                        100% 1856     1.8KB/s   00:00

#我们可以看到,由于上个实验中,服务端与客户端实现了不需要密码就可以远程登录,再次拷贝中也是不需要任何密码的

2:查看1.64客户端

@xuegod-64 ~]# ls /tmp/passwd

/tmp/passwd

#可以看到在1.64;客户端上有了刚才在服务端拷贝过来的passwd文件

 

2把文件从远程主机copy到当前系统一台主机上

 

1:在服务端上将客户端的psswd拷贝到服务端的/opt目录下

[root@xuegod-63 ~]# scp root@192.168.1.64:/etc/passwd  /opt

passwd                                        100% 1895     1.9KB/s   00:00

 

2:查看1.63服务端

@xuegod-63 ~]# ls /opt/

/opt/passwd


 

第六块:SSH远程启动服务

 

1)远程查看1.64客户端的阿帕奇服务器的运行状态

[root@xuegod-63 ~]# ssh 192.168.1.64 /etc/init.d/httpd status

httpd 已停

#这里我们可以看到,1.64客户端的阿帕奇服务器的运行状态是关闭的

 

2)远程开启1.64客户端阿帕奇服务器

[root@xuegod-63 ~]# ssh 192.168.1.64 /etc/init.d/httpd restart

停止 httpd:[失败]

正在启动 httpd:httpd: apr_sockaddr_info_get() failed for xuegod-64

httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName

[确定]

#这个时候我们看到1.64客户端的阿帕奇服务器是被我们远程开启了

 

3)再次远程查看1.64客户端的阿帕奇服务器的运行状态

[root@xuegod-63 ~]# ssh 192.168.1.64 /etc/init.d/httpd status

httpd (pid  10474) 正在运行...

#可以看到1.64的阿帕奇服务器的运行状态是开启的