linux下安装SSH服务及使用详解
ssh服务介绍说明
secure shell protocol简称SSH,是由IETF网络工作小组(network working group) 制定,在进行数据传输之前,SSH先对联级数据包通过加密技术进行加密处理,加密后在进行数据传输,确保了传递的数据安全.
SSH是专门为远程登录会话和其他网络服务(例如:rsync,ansible)提供的安全性协议
,利用SSH协议可以有效的防止远程管理过程中的信息泄露问题,绝大多数企业普遍采用SSH协议服务来代替传统的不安全的远程连接服务器软件(例如:Telnet/23端口/非加密的)等.
- 在默认状态下,SSH服务主要提供两个服务功能:
- 提供类似Telnet远程连接服务器的服务,即上面提到的SSH服务(具有数据加密功能)
- 另一个是类似FTP服务的sftp-server,借助SSH协议来传输数据,提供更安全的SFTP服务(vsftp,proftp).
说明
ssh客户端(ssh命令)还包含着一个很有用的远程安全拷贝命令scp
也是通过ssh协议工作的!
- openssh是SSH服务端软件之一,可同时支持SSH1和SSH2版本协议,可以在配置文件中使用protocol指令,指定只支持其中一种或者两种都支持,默认情况下系统默认配置的是仅支持SSH2协议
ssh服务连接排错
- 检查链路是否通畅
#客户端
ping + 服务器ip地址
#客户端
traceroute/tracert ip地址
- 检查防火墙是否阻止链路通讯
#由于防火墙存在可能一次关闭不上的问题,需要多执行几遍关闭命令
/etc/init.d/iptables stop
- 查看是否有服务提供网络连接
测试服务端口有没有开启多个方法
#Telnet命令
telnet 10.0.0.21 22
#ss命令
ss -lntup|grep 22
#netstat命令
netstat -lntup|grep 22
#nmap命令
nmap -p 22 10.0.0.21
#nc命令
nc 10.0.0.21 22
- 一个服务始终无法启动起来
- 查看日志
- 检查服务端口是否有冲突
在启动服务之前,这个服务的端口就被其他服务占用了,可以更改服务启动端口,在线上环境遇到后,不要随便就kill掉这个端口
远程登录服务对比
- 配置Telnet远程连接服务
- 安装telnet服务软件
yum -y install telnet telnet-server
- 配置xinnetd服务目录中的telnet文件,让telnet服务允许被
xinetd
服务管理
说明
(1)telnet是没有自己的服务启动脚本的,例如无法使用:/etc/init.d
(2)所以需要借助xinetd服务(超级守护进程)
,让telenet服务允许被xinetd服务管理
#如果没有安装xinetd服务yum安装即可
yum -y install xinetd
#vim编辑xinetd.d目录下面服务对应的配置文件,这里的服务是telnet就编辑telnet文件
vim /etc/xinetd.d/telnet
service telnet
{
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID
disable = no #把这里的yes改成no,yes表示不允许,no表示允许被管理
}
- 启动xinetd服务
#启动服务
#centos7.x是用systemctl
systemctl start xinetd.service
#centos6.x
/etc/init.d/xinetdw restart
#查看是否启动起来
ps -ef|grep xinetd
root 33095 1 0 16:27 ? 00:00:00 /usr/sbin/xinetd -stayalive -pidfile /var/run/xinetd.pid
#查看telnet是否由xinetd服务启动起来
ss -lntup|grep 23
tcp LISTEN 0 64 :::23 :::* users:(("xinetd",pid=33362,fd=5))
- SSH远程连接服务与telnet服务区别
- SSH服务是加密服务协议,telnet服务是非加密服务协议
- SSH服务默认支持root用户登录,telnet服务默认不支持root用户登录
由于不支持root用户登录,所以要建立一个普通用户设置密码后进行登录
#登录测试
[D:\~]$ telnet 10.0.0.11
Connecting to 10.0.0.11:23...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
Kernel 3.10.0-862.el7.x86_64 on an x86_64
ansible-1 login: shuai
# Password: #输入密码是看不到的,尽管输入即可
验证SSH和telnet服务安全性
验证telnet是否明文传输数据
开抓包工具,这里用的工具是
Wireshark
-
过滤telnet包
进行
telnet
连接服务器
在命令行输入
telnet 10.0.0.11
- 在
Wireshark
中找到的数据包显示和连接登录时是相同的
然后开始输入用户名
-
为了方便查看,我们找到开始显示登录用户名的这条数据包
右击选中追踪流,在右侧再选中TCP流
即可显示数据包的全过程,圈中的部分是用户名,之所以每个单词重复出现,是因为数据有请求,有确认,所以会重复,去重以后就是用户名:shuai,密码:123456
说明
由此可以验证telnet传输数据是明文传输的,所以不太安全!
验证SSH服务传输数据是否加密
- 使用同样的做法,选择过来ssh数据包,然后在连接软件上
进行ssh方式连接
-
接收到数据包后使用选择追踪流,在选择TCP流
说明
追踪流中我们可以看到所有的信息都是加密显示的,可以看做是一堆乱码,根本找不到规律,破解出你用户和密码信息来,所以ssh比起telnet服务要安全的多!
-
连接登录过程中发生了什么?
在显示yes/no
的时候,如果输入的yes
就接收到了服务端发送过来的公钥信息,把这个信息放到了/root/.ssh/known_hosts文件
里
SSH知识要点总结
- SSH是安全的加密协议,用于远程连接linux服务器
- SSH默认端口是22号端口,安全协议版本SSHv2,出了SSHv2版本之外还有SSHv1版本(有漏洞,不安全)
- SSH服务端主要包含两个服务功能SSH远程连接和SFTP服务
- Linux SSH客户端包含SSH远程连接命令,已经远程拷贝
scp
命令等!
SSH服务详解说明
SSH服务由服务端软件OpenSSH(Openssl)
和客户端常见的有SSH(linux),secureCRT,putty,Xshell
组成.SSH服务默认使用22端口提供服务,他有两个不兼容的SSH协议版本,分别是1.x和2.x
- 默认SSH软件不能直接安装
yum install -y ssh
No package ssh available.
Error: Nothing to do
获取SSH服务的软件包
rpm -qf `which ssh`
openssh-clients-7.4p1-16.el7.x86_64
SSH服务软件命令知识
-
openssh-clients客户端软件信息
rpm -ql openssh-clients
/etc/ssh/ssh_config #ssh客户端配置文件
/usr/bin/scp #远程复制命令
/usr/bin/sftp #远程文件传输服务
/usr/bin/slogin #远程登录命令
/usr/bin/ssh #SSH远程登录管理主机命令
/usr/bin/ssh-add
/usr/bin/ssh-agent
/usr/bin/ssh-copy-id #SSH服务分发公钥命令
/usr/bin/ssh-keyscan
-
/usr/bin/slogin(远程登录命令使用方法)
-
openssh-server服务端软件信息
root@ansible-2:~#:rpm -ql openssh-server
/etc/rc.d/init.d/sshd #ssh服务启动脚本
/etc/ssh/sshd_config #ssh服务配置文件信息
/usr/sbin/sshd #ssh服务守护进程命令
~/.ssh/known_hosts #记录公钥的文件
- /usr/sbin/sshd:守护进程命令
可以直接使用此命令启动ssh服务
注意
使用此命令需要绝对路径
/usr/sbin/sshd
-
查看sshd进程
说明
(1)箭头所指的是ssh真实的进程
(2)箭头下面一条是连接进来的用户,把这个用户kill掉后会导致断开链接
(3)把SSHD主进程kill掉后,不会导致已连接用户断线,会保留此用户在里面,直到此用户主动断开链接,但是SSHD主进程断掉后其他用户不能再连接进此系统
known_hosts 文件引起的报错问题及解决
- ~/.ssh/known_hosts文件使用说明
ssh会把你每个你访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts。当下次访问相同计算机时,OpenSSH会核对公钥。如果公钥不同,OpenSSH会发出警告, 避免你受到DNS Hijack之类的攻击。
如果在进行连接的时候出现以下情况,如何解决
解决方案:
- 手动删除修改known_hsots里面的内容;
- 修改配置文件“~/.ssh/config”,加上这两行,重启服务器。
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
优缺点:
- 需要每次手动删除文件内容,一些自动化脚本的无法运行(在SSH登陆时失败),但是安全性高;
- SSH登陆时会忽略known_hsots的访问,但是安全性低;
获取OpenSSL包含的软件包信息
rpm -qa|grep openssh
openssh-clients-7.4p1-16.el7.x86_64
openssh-server-7.4p1-16.el7.x86_64
openssh-7.4p1-16.el7.x86_64
说明
SSH服务端是一个守护进程(daemon)
,它在后台运行并响应来自客户端的连接请求,SSH服务端进程名为sshd
,负责实时监听远程,SSH客户端的远程连接请求
,并进行处理,一般包括公共密钥认证,密钥交换,对称密钥和非安全连接等.SSH服务一般都要保持开机自启
SSH加密技术说明
- ssh服务实现连接安全连接建立,利用"钥匙"和"锁头":
- 钥匙=私钥 锁头=公钥
- 私钥不能在网络中传输------私钥可以解密公钥(钥匙可以开启锁头)
公钥可以在网络中传输------公钥不能解密私钥
SSH服务认证类型
(1)基于密码/口令安全验证
基于口令的安全验证方式就是知道服务器的SSH连接账号和口令(也要知道对应服务器的IP地址及开放的SSH端口,默认为22端口)就可以通过SSH客户端登录到远程主机上面,此时联机过程中所有传输的数据都是加密的!
- 演示XSHELL及SSH客户端连接,口令验证测试
#方法一
ssh -p22 root@10.0.0.11
## Heading
#方法二
ssh 10.0.0.11
(2)基于密钥(钥匙锁头)的安全验证
基于密钥的安全验证方式是指,需要依靠密钥,也就是必须事先建立一对密钥对,然后把公用密钥(锁头:public key)
放在需要访问的目标服务器上,另外,还需要把私有密钥(钥匙:private key)
放到SSH的客户端或对应的客户端服务器上.
此时,如果想要连接到这个带有公用密钥的SSH服务器上,客户端SSH软件或者客户端服务器就会向SSH服务器发出请求,请用联机的用户密钥进行安全验证,SSH服务器收到请求之后,会先在该SSH服务器上连接的用户的家目录下面寻找事先放上去的对应用户的公用密钥,然后把它和连接SSH客户端发送过来的公用密钥进行比较,如果两个密钥一直,SSH服务器就用公用密钥加密"质询(challenge)"并把它发送给SSH客户端!
SSH客户端收到"质询"之后就可以用自己的私钥解密,在把它发送给SSH服务器,使用这种方式,需要知道联机用户的密钥文件,与第一种基于口令验证的方式相比,第二种方式不需要在网络上传送口令密码,所以安全性更高了,这是我们也注意保护我们的密钥文件,特别是私钥文件,一旦被黑获取到,危险系数增大很多.
SSH配置文件(重要)
SSH配置文件默认路径信息
- SSHD服务配置文件
ls -l /etc/ssh/sshd_config
-rw-------. 1 root root 3907 Apr 11 2018 /etc/ssh/sshd_config
- 在编辑sshd_config配置文件之前先备份
养成良好的习惯是对自己和公司负责任,备份重要的配置文件防止不当操作
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
SSH配置文件修改-默认登录参数
修改SSH服务的运行参数,是通过修改配置文件/etc/ssh/sshd_config
来实现的.
一般来说SSH服务使用默认的配置已经能够很好的工作了,如果对安全要求不高,仅仅提供SSH服务的情况,可以不需要修改任何参数配置.
- 下面提供一下平常企业中SSH服务配置参数
vim /etc/ssh/sshd_config
Port 52117 #SSH连接默认端口为22,为提高安全性改成0-1024以外的端口号(0-1024很多知名服务已经占用,用了有可能冲突)
PermitRootLogin no #禁止root用户远程登录,只能使用普通用户登录后切换到root
PermitEmptyPasswords no #禁止空密码登录
UseDNS no #不使用DNS域名解析.打开会导致连接慢,(在连接的时候会反向解析,根据IP地址解析出主机名,没有意义!)
GSSAPIAuthentication no #关闭GSSAPI认证,每次连接都会认证,在内网使用没必要打开次认证
- 企业案例:linux下SSH远程连接服务慢解决方案
- 企业优化SSH服务
#备份配置文件
cp /etc/ssh/sshd_config{,.bak}
#利用sed在最后添加一下内容,再备份原有信息
sed -i.ori.20190101 '$ aPort 52113\nPermitRootLogin no\nPermitEmptyPasswords no\nUseDNS no \nGSSAPIAuthentication no' /etc/ssh/sshd_config
- 打开编辑sshd_config配置文件
vim /etc/ssh/sshd_config
说明:
(1)为什么这里的注释有带空格有不带空格的?
"#"注释后面带空格
表示后面的是描述信息
"#"注释后面不带空格
表示后面的是相关参数信息,也是默认参数配置信息
(2)在更改配置文件时,多开几个连接窗口,方式更改错误后关闭窗口连接不进去的情况
- 配置文件:ListenAddress:监听地址说明
#vim编辑sshd_config配置文件
vim /etc/ssh/sshd_config
#找到以下两行参数
#ListenAddress 0.0.0.0
#ListenAddress ::
#修改参数
ListenAddress 10.0.0.0 #监听10.0.0.0网段
#重启sshd服务
systemctl restart sshd
#查看监听地址是否改变
ss -lntup |grep sshd
tcp LISTEN 0 128 10.0.0.0:22 *:* users:(("ssh",pid=70311,fd=3))
SSH服务监听参数说明
SSH服务入侵防范
- 如何防止SSH登录入侵小结
- 用密钥登录,不用密码登录
- 防火墙封闭SSH,指定源IP限制(局域网,信任公网)
开启SSH只监听本地内网IP(例如:ListenAddress 172.16.1.31) - 尽量不给服务器外网IP
- 最小化(软件安装-授权-有用的装没用的不装)
- 给系统重要文件或者命令做一个指纹(编写一个脚本,实时监控文件的指纹是否变动,如果变动立即发送邮件进行告警!)
SSH服务相关命令用法
- ssh基本语法使用
- ssh远程登录命令
ssh -p22 root@10.0.0.11
#-p(小写)接端口号,默认端口号是22
#" "@" " 前面是用户名,也可以不指定用户名
后面是要连接的IP地址
#端口改变的情况怎么连接
ssh -p(更改的端口号) (用户)@(IP地址)
报错说明
(1)如果端口修改了,直接连接后会提示
ssh: connect to host 10.0.0.11 port 22 : Connection refused
(2)报错字符串对应的可能存在的问题
no route to host #可能是防火墙引起的
Connection refused #可能是防火墙引起的
Connection refused #还可能是连接的对端服务没开或者端口改变引起的
- SSH远程连接方式-windows客户端连接
windows下实现远程连接的软件一般有SecureCRT,putty,xshell等工具
连接远程桌面的工具有VNC,MobaXterm等工具
这里我使用的是XSHell
连接工具
- scp远程复制数据命令
推送:PUSH
scp -P22 -rp /tmp/shuai.txt geek@10.0.0.21:/tmp
#-P(大写) 接端口号
#-r递归,表示拷贝目录
#-p(小写)表示拷贝前后保持文件或目录的属性
#-l limit 限制速度,在传输大量文件的时候用是此参数可以减少带宽占用,防止因为大量占用带宽导致网络延迟增大
# /tmp/shuai.txt为本地目录文件,"用户名"@"目标IP地址":(远端主机目标目录)
拉取:PULL
scp -P22 -rp root@10.0.0.11:/tmp/shuai.txt /opt
#还可以把远端目录拉取到本地
SSH服务远程命令-sftp命令
- windows客户端和linux服务端之间传输数据工具
rz/sz(lrzsz)
winscp WinSCP-v4.0.5 基于SSH,sftp
-
XFTP(XSHELL windows工具)
SFTP 基于SSH加密传输,linux命令
- FTP工具
- vsftp
- proftp
- SFTP
- sftp数据传输命令
- 进行目标服务器连接
sftp -oPort=22 root@10.0.0.21
root@10.0.0.21's password: #输入密码
Connected to 10.0.0.21.
sftp> #进入到操作阶段,可以在这里输入操作指令
- 连接成功后如何进行命令操作
sftp> help 显示帮助信息
cd 切换远程目录路径
ls 显示远端主机目录文件列表
lls 显示本地
pwd 查看远端工作目录信息
lpwd 查看本地
rm 删除文件
put /tmp/ssscp.txt /tmp/ 上传文件到远端服务器
get /tmp/ssscp.txt /opt/ 远程文件下载到本地
#上传/下载可以不接目录,注意切换目录位置,或者自己接参数说明文件在那个位置
说明
只要想查看本地的东西在命令前面加一个l
即可!
SSH重点知识小结
- SSH协议:sshd--远程连接(sshd),sftp
- 为加密的远程连接协议,先关软件有openssh,openssl---https
- 默认端口22
- 协议版本分为v1.x/v2.x, v2.x最为安全,了解SSH协议原理(ssh连接过程)
- 服务SSH远程连接服务,SFTP服务,sshd守护进程,开机要自启
- SSH客户端包好ssh,scp,sftp命令
- ssh安全验证方式:口令和密钥,这两种都是基于口令的,sshd密钥登录的原理
- ssh安全优化,修改端口号,禁止root用户远程连接,机制dns,ssh只监听内网
- ssh密钥对,公钥(public key)在服务端,比喻就是锁头,私钥(private key)在客户端比喻就是钥匙!