ssh环境搭建与管理 (详解)
实验环境
服务端:xuegod-63 IP:192.168.1.63
客户端:xuegod-64 IP:192.168.1.64
客户端普通用户:ceshi 密码:123456
安装好扫描软件rpm -ivh /mnt/Packages/nmap-5.21-4.el6.x86_64.rpm
实验目标
1:SSHD服务介绍
2:SSHD服务安装配置
3:两Linux服务器之间数据拷贝
4:SSHD服务作用:
实验步骤
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
查看一下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.63上的root用户)来登陆远程服务器的,
在开头以RSA的哪行后面接的就是远程服务器(即1.64,客户端)的公钥指纹码,如果确认没有问题,那么你就需要输入yes来表示确认,将该指纹码写入到服务器公钥记录文件(~/etc/ssh/ssh_hosts_*)以便对比服务器的正确性,
RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
现在由于远程服务器(即1.64客户端)的公钥文件已经被记录在本机1.63上了,因此在后面本机1.63在重复登录客户端的话,就不在需要指纹码验证了,
4):测试- - -加入用户名远程登录的两种方法
#由于加入了用户名,因此该主机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
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:测试
#可以看到,我们是没有登录进去的,告诉我们端口22,连接失败。
#加“-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配置文件。
保存退出。
重启网络服务
[root@xuegod-63 ~]# /etc/init.d/network restart
修改配置文件
[root@localhost network-scripts]# vim /etc/ssh/sshd_config
修改默认在哪个IP地址上监听:
改:
#ListenAddress 0.0.0.0
为:
ListenAddress 192.168.3.63
重启sshd服务
Servcie sshd resatrt
测试
#这个时候我们可以看到到,链接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
安全设定项 |
# 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的阿帕奇服务器的运行状态是开启的