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进程登录远程主机

ssh环境搭建与管理(详解)_第1张图片 

#由于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,连接失败。

ssh环境搭建与管理(详解)_第2张图片 

#加“-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

ssh环境搭建与管理(详解)_第3张图片

ssh环境搭建与管理(详解)_第4张图片

 

 

保存退出。

 

重启网络服务 

[root@xuegod-63 ~]# /etc/init.d/network restartssh环境搭建与管理(详解)_第5张图片

 

 

修改配置文件

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

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

改:

#ListenAddress 0.0.0.0

为:

ListenAddress 192.168.3.63

ssh环境搭建与管理(详解)_第6张图片 

 

重启sshd服务

Servcie sshd resatrt

 

测试

ssh环境搭建与管理(详解)_第7张图片 

#这个时候我们可以看到到,链接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

[email protected]'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

[email protected]'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

[email protected]'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

[email protected]'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 [email protected]:/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 [email protected]:/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的阿帕奇服务器的运行状态是开启的