目录
1 SSH简介
SSH 是Secure Shell Protocol的简写,由IETF网络工作小组( Network Working Group)制定;在进行数据传输之前,SSH先对联机数据包通过加密支术进行加密处理,加密后再进行数据传输。确保了传递的数据安全。
SSH 是专为远程登录会话和其他网络服务提供的安全性协义。利用SSH协议可以有效的防止远程管理过程中的信息泄露问题,在当前的生产环境运维工作中,绝大多数企业普遍采用SSH协议服务来代替传统的不安全的远程联机服务软件,如telnet(23端口,非加密的)等。
在默认状态下,SSH服务主要提供两个服务功能:一个是提供类似telnet远程联机服务器的服务,即上面提到的SSH服务;另一个是类似FTP 服务的sftp-server,借助SSH协议来传输数据的,提供更安全的SFTP 服务(vsfp.proftp)。SSH 客户端(ssh 命令)还包含一个很有用的远程安全拷贝命令scp。
知识小结:
1、SSH 是安全的加密协议,用于远程连接linux 服务器。
2、SSH 默认端口是22,安全协议版本SSH2,除了2 之外还有SSH1(有漏洞)。
3、SSH 服务端主要包含两个服务功能SSH 远程连接和SFTP 服务。
4、Linux SSH 客户端包含ssh 远程连接命令,以及远程拷贝SCP命令等。
1.1 SSH连接原理
OpenSSH同时支持两个版本(1和2)。
2版本的客户端程序不能连接到1版本的服务程序上。
SSH2同时支持RSQ(默认)和DSA密钥,但是SSH1仅支持RSA密钥。
1.1.1 SSH1
每一台SSH服务器主机都可以使用RSA加密方式来生产一个1024-bit的RSA
Key,这个RSA的加密方式就是用来生产公钥与私钥的算法之一。SSH1的整个连接加密步骤如下:
a.当SSH服务启动时,就会产生一个768-bit的临时公钥(sshd_config配置文件中ServerKeyBits
768,Centos6.X为1024 bit)存放在Server中。b.当Client端SSH联机请求传送过来时,Server就会将这个768-bit的公钥传送给Client端,此时Client会将此公钥与先前存储的公钥进行比对,看是否一致。判断标准是Client端联机用户文件\~/.ssh/known_hosts的内容(Linux客户端)
c.在客户端接收到这个768-bit的Server Key后,Client本地也会随机产生一个256-bit的私钥(Private Key或host key),并且以加密的方式将Server key与hosts key整合成一对完整的Key pair,并将这对Key pair再传给Server。
d.当客户端完成以后,Server与Client端在这次的联机中,就以这一对1024-bit的Key pair来进行数据的传输。也就是说,Public key是放在Server上的(相当于锁),而Client的软件需要能接受Public key、计算出Private key,并把二者组合成一把独一无二的Key pair,因袭Client每次的256-bit的host key是随机产生的。
e.当回话结束时,服务器将向客户端发送回话终止信号,双方退出。
1.1.2 SSH2
在SSH1的联机过程中,当Server接受Client 端的Private key后,就不再针对该次联机的Key pair进行检验。此时若有恶意黑客针对该联机的Key pair对插入恶意的程序代码时,由于服务端不会再检验联机的正确性,因此可能会接收该程序代码,从而造成系统被黑掉的问题。
为了改正这个缺点,SSH version 2 多加了一个确认联机正确性的Diffie-Hellman机制,在每次数据传输中,Server都会以该机制检查数据的来源是否正确,这样,可以避免联机过程中被插入恶意程序代码的问题。也就是说,SSH version 2 是比较安全的。
由于SSH1协议本身存在较大安全问题,因此,建议大家尽量都用SSH2的联机模式。而联机版本的设置则需要在SSH
主机端与客户端均设置好才行。其实,在当前的CentosS.x 系统ssh服务端的配置,默认就是配置只支持SSH2的,我们只需要在ssh客户端远程连接时指定通过ssh2 协议连接即可。
基于口令的安全验证:
基于口令的安全验证的方式就是我们现在一直在用的,只要知道服务器的SSH连接帐号和口令(当然也要知道对应服务器的IP及开放的SSH端口,默认为22),就可以通过ssh客户端登录到这台远程主机。此时,联机过程中所有传输的数据都是加密的。
基于密钥的安全验证:
基于密钥的安全验证方式是指,需要依靠密钥,也就是必须事先建立一对密钥对,然后把公用密钥(Public
key)放在需要访问的目标服务器上,另外,还需要把私有密钥(Private key)放到SSH的客户端或对应的客户端服务器上。
此时,如果要想连接到这个带有公用密钥的SSH 服务器,客户端SSH软件或者客户端服务器就会向SSH
服务器发出请求,请求用联机的用户密钥进行安全验证。SSH服务器收到请求之后,会先在该SSH服务器上连接的用户的家目录下寻找事先放上去的对应用户的公用密钥,然后把它和连接的SSH客户端发送过来的公用密钥进行比较。如果两个密钥一致,SSH服务器就用公用密钥加密“质询”(challenge) 并把它发送给SSH 客户端。
1.2 企业面试题
给一个端口号,如何在命令行查出对应的服务是什么?
lsof -i tcp:52113
netstat -lntup|grep -w "22"
给一个进程名oldboy,如何查看对应的端口是什么?
netstat -lntup|grep oldboy
2 SSH优化
配置文件主要优化参数说明
参数 | 说明 |
---|---|
Port | 指定sshd进程监听的端口号,默认为22。可以是使用多条指令监听多个端口。默认将在本机的所有网络接口上监听,但是可以通过ListenAddress指定只在某个特定的接口上监听。 |
PermitEmptyPasswords | 是否允许密码为空的用户远程登录。默认为“no” |
PermitRootLogin | 是否允许root登录。可用值如下:“yes”(默认)表示允许。“no”表示禁止。“without-password”表示禁止使用密码认证登录。“force-commands-only”表示只有在指定了command选项的情况下才允许使用公钥认证登录。同时其它认证方法全部被禁止。这个值常用于做远程备份之类的事情。 |
UserDNS | 指定sshd是否应该对远程主机名进行反向解析,以此检查此主机名是否与其IP地址真是对应。默认值为“yes”。 |
#基础优化,有必要的情况下还要把监听ip改成内网网段。
[root@m01 ~]# sed -n '13,17p' /etc/ssh/sshd_config
Port 52113 #改默认端口为52113
PermitRootLogin no #禁止root用户登录
PermitEmptyPasswords no #禁止空密码登录
UseDNS no #不使用DNS解析,可以加快访问速度
GSSAPIAuthentication no #http://blog.51cto.com/oldboy/1300964
#一条命令搞定
sed -ir '13 iPort 52113\nPermitRootLogin no\nPermitEmptyPasswords no\nUseDNS no\nGSSAPIAuthentication no' /etc/ssh/sshd_config
sed -n '13,17p' /etc/ssh/sshd_config
#修改完需要重载sshd服务,个人测试好像重载不行,需要重启
/etc/init.d/sshd reload
/etc/init.d/sshd restart
2.1 Linux下SSH远程连接服务慢
http://blog.51cto.com/oldboy/1300964
2.2 企业案例
2.2.1 利用sed实战修改多行配置
http://blog.51cto.com/oldboy/1610998
2.2.2 SSH入侵登录
http://blog.51cto.com/phenixikki/1546669
2.2.3 如何防止SSH登录入侵
1、用密钥登录,不用密码登录
2、牤牛阵法:解决SSH安全问题
a.防火墙封闭SSH,指定源IP限制(局域网、信任公网)
b.开启SSH只监听本地内网IP(ListenAddress 内网IP)
3、尽量不给服务器外网IP
3 SSH客户端命令
3.1 ssh
ssh -p22 oldboy@192.168.90.31 [command]
#->SSH连接远程主机命令的基本语法:
#->-p(小写)接端口,默认22端口时可以省略-p22
#->“@”前为用户名,如果用当前用户连接,可以不指定用户。
#->“@”后面为要连接的服务器的IP地址,更多用法,可以man ssh
#->也可以远程连接执行命令(注意命令要跟全路径):
ssh -p52113 oldboy@192.168.90.31 /bin/ls -l
3.1.1 报错问题及原因
如果端口已修改为特殊端口,那么用上面的命令连接就会发生问题:
[root@m01 ~]# ssh -p22 oldboy@172.16.1.31
ssh: connect to host 172.16.1.31 port 22: Connection refused #提示拒绝连接
#报错字符串对应的可能原因:
1、no root to host 可能防火墙影响
2、Connection refused 可能为防火墙
还可能是链接的对端服务没开启或端口改变了
3.1.2 小结
1、切换到别的机器上 ssh -p52113 user@ip ([user\@hostname]) [command]
2、到其他机器执行命令(不会切到机器上)ssh -p52113 user\@IP 命令(全路径)
3、当第一次SSH连接的时候,本地会产等一个密钥文件~/.ssh/known_hosts(多个密钥)。
4、Windows下实现远程连接的软件一般有SecureCRT,Putty,Xshell等工具。
3.2 scp
推:scp -P52113 /etc/hosts oldboy@172.16.1.31:/tmp
拉:scp -P52113 oldboy@172.16.1.31:/tmp /data
3.2.1 案例
案例:某DBA做数据同步,带宽占满,导致用户无法访问网站。
解决办法:rsync scp ftp 限速功能
3.2.2 小结
#特别提示:
scp接端口号时需要用大写P,-r表示复制目录,-p(小写)表示拷贝过程中保持文件或目录的原始属性。
1、scp是加密的远程拷贝,而cp仅为本地拷贝。
2、可以把数据从一台机器推送到另一台机器,也可以从其它服务器把数据拉回到本地。
3、每次都是全量完整拷贝,因此,效率不高,适合第一次拷贝用,如果需要增量拷贝,用rsync。
3.3 sftp
#登录FTP的方法就是sftp oldboy@ip 如果ssh端口为52113则登录命令如下:
[root@m01 ~]# sftp -oPort=52113 oldboy@172.16.1.31
Connecting to 172.16.1.31...
oldboy@172.16.1.31's password:
sftp> pwd
Remote working directory: /home/oldboy
sftp> put /etc/hosts #把/etc/hosts从客户端上传到sftp服务器当前连接目录,即/home/oldboy
Uploading /etc/hosts to /home/oldboy/hosts
/etc/hosts 100% 349 0.3KB/s 00:00
sftp> ls
hosts
sftp> ls -l #长格式显示
-rw-r--r-- 1 oldboy oldboy 349 Feb 9 21:59 hosts
sftp> put /etc/hosts /tmp/ #也可以把/etc/hosts从客户端本地传到sftp服务器指定的目录/tmp
Uploading /etc/hosts to /tmp/hosts
/etc/hosts 100% 349 0.3KB/s 00:00
sftp> mkdir /tmp/ett
sftp> get hosts /home/oldboy #下载用get
Fetching /home/oldboy/hosts to /home/oldboy/hosts
/home/oldboy/hosts 100% 349 0.3KB/s 00:00
sftp> help #可以查看帮助
3.3.1 sftp命令小结
1、Linux下连接命令sftp -oPort=52114 oldboy\@ip
2、上传put加客户端本地路径 put /etc/hosts。也可以指定路径上传put /etc/hosts /tmp(安全风险,需要控制)
3、下载get服务端的内容get hosts,Linux下载到本地连接前的目录,也可以指定路径下载,get hosts /etc/
4、连接到的远端家目录为默认目录,也可以切换到其他有权限的目录下。 如何把sftp用户登录的目录限制到指定的目录
5、windows下上传:put “D:\a.txt”
4 SSH基础服务小结
1、ssh为加密的远程连接协议。相关的软件有openssh,openssl
2、默认端口为22
3、协议版本1.x和2.x,2.x更安全。
4、服务端ssh远程连接服务,sftp服务。sshd守护进程开机要自启动
5、ssh客户端包含ssh、scp、sftp命令。
6、ssh服务安全优化,修改默认端口22,禁止root远程连接,禁止dns,SSH只监听内网IP。
7、ssh安全验证方式:口令和密钥,这两种都是基于口令的,SSH密钥登录的原理。
8、ssh密钥对,公钥(public key)在服务器端,比喻就是锁头,私钥(private key)在客户端,比喻就是钥匙。
企业里软件升级:
yum install bash
不要轻易执行
更新流程:
办公室环境—–IDC机房测试环境—–IDC机房正式环境。
50%的故障是人为造成的额,50%故障是未知的。
转载至https://blog.csdn.net/mr_rsq/article/details/79619600