9、ssh服务详解及优化
ssh是“secure shell protocol”的简写,在进行数据传输之前,ssh先对练级数据包通过加密技术进行加密处理,
加密后再进行数据的传输,从而确保了数据的安全;
ssh是专为远程登录会话和其它网络服务提供安全性协议,利用ssh协议可以有效的防止远程管理过程中的信息泄露问题
在当前的生产环境运维中,绝大多数企业普遍采用ssh协议服务来代替传统的不安全的远程联机服务软件,如telnet(23端口,非加密);
在默认的情况下,ssh服务提供两个服务功能:一个类似telnet远程联机服务,即ssh远程联机,另一个类似
FTP服务的sftp-server,借助ssh协议来传输数据,提供更安全的sftp服务;
ssh客户端包含一个安全的远程拷贝命令scp;
9.1、查看端口号:
[root@web01 ~]# netstat -tunlp | grep sshd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1827/sshd
#0.0.0.0(代表监听所有网卡):22端口号
tcp 0 0 :::22 :::* LISTEN 1827/sshd
9.2、启动:/etc/init.d/start
9.3、查看进程:ps -ef | grep sshd | grep -v grep
9.4、开机自启动:chkconfig sshd on
[root@web01 .ssh]# chkconfig --list sshd
sshd 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
1、根据端口号查出对应的服务
lsof -i :22
netstat -tunlp | grep -w 22
2、根据进程名查看对应的端口号:
netstat -tunlp | grep “sshd”
9.5、ssh小结:
1、ssh连接命令基本语法使用:
ssh -p22 lc@172.16.1.41
-p:接端口,默认22端口是可以省略
@:
@前面为用户名,如果用当前用户连接可以不指定用户
@后面为要连接的服务器的ip
2、提示:ssh -p52113 lc@172.16.1.41 /sbin/ifconfig eth0(会提示输入远程服务器的密码)
此命令表示ssh到远程服务器,执行命令,但是还是在本地服务器上
3、ssh连接报错:
(1)ssh -p22 lc@172.16.1.41
ssh: connect to host 10.0.0.61 port 52113: Connection refused #拒接连接
原因:远程服务器端口服务没有启动、端口不对,可能是防火墙
(2)no route to host
原因:防火墙可能没有关闭
4、知识点:
ssh是安全的加密协议,用于远程连接linux服务器
ssh默认端口号是22,安全协议版本ssh2,出了2之外还有ssh1(有漏洞)
ssh服务端主要包含两个服务功能ssh远程连接和sftp服务
linux ssh客户端包含ssh远程连接命令,以及远程拷贝scp命令等
ssh服务端是一个守护进程,进程名为sshd;
9.6、ssh服务认证的类型:
ssh通过对称加密对数据进行加密,然后通过密码验证或是通过秘钥对进行验证登录,后者更安全,因为前者可能会有中间人进行监听获取远程服务端的密码;
对称加密是使用对方的公钥进行加密,各自使用自己的秘钥进行解密,其中公钥有根钥进行验证其合法性;
一般对称加密和非对称加密的公钥都会存放在对方主机上进行存储;
ssh加密和https加密不具有验证的唯一性,因为https的根钥是共用的,ssh的公钥也是共用的;openvpn数据加密具有验证用户的唯一性,因为它的根钥是唯一的,
1、口令认证:
容易受中间人攻击;客户端当前用户可用远程主机的任意用户登陆到远程主机,远程主机的公钥存会存放在客户端当前用户的~/.ssh/目录之下;
ssh -p22 root@172.16.1.31
只要知道服务器的ssh连接账号和口令,通过ssh客户端登录到服务器;
远程主机收到用户的第一次登录请求时,由于客户端本地没有远程主机的公钥,无法得知远程主机的真实性,会发出警告(询问客户端是否接受服务端的公钥);
当远程主机的公钥被接受以后,它就会被客户端保存在文件$HOME/.ssh/known_hosts之中;
用户使用这个公钥,将登录密码加密后,发送给服务器端;
远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录;
下次再连接这台主机,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码;
秘钥认证(秘钥、公钥存放家目录的用户和登陆的用户必须一致,且是建立在口令认证之上的;一对一,类似于nfs的用户模式;)
使用口令认证,每次都必须输入密码,非常麻烦。好在SSH还提供了秘钥认证,可以省去输入密码的步骤;
客户端事先建立一对秘钥对,然后把公钥放在需要访问的远程主机上,另外还需把私有秘钥放到对应的客户端服务器上;
当客户端请求登录时远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后再发送给远程给主机;
远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码;
2、ssh秘钥认证建立过程:
(1)所有机器在root下创建用户和密码(当ssh被优化时,root用户是没有ssh登录权限的)
useradd lc(所有的服务器都要建立该用户)
echo '123456' | passwd --stdin lc
(2)建立秘钥对:
[lc@m01 .ssh]$ ssh-keygen -t dsa #直接回车;默认存放目录是~/.ssh/
id_dsa#秘钥600
id_dsa.pub#公钥644
(3)非交互式建立秘钥对
[lc@m01 .ssh]$ ssh-keygen -t dsa -P ' ' -f ~/.ssh/id_dsa >/dev/null 2>&1
(4)发送公钥到远程主机:
默认ssh端口是22:
[lc@m01 .ssh]$ ssh-copy-id -i ~/.ssh/id_dsa.pub lc@172.16.1.31
更改ssh端口后:
[lc@m01 .ssh]$ ssh-copy-id -i ~/.ssh/id_dsa.pub "-p 52113 lc@172.16.1.31"
#此方法只能发送公钥,且发送的位置是远程主机的~/.ssh/目录下,名字变为‘authorized_keys’(权限位600),不能够发送私钥,如果
需要发送公钥需要使用scp命令拷贝到对应用户的家目录下并改名为authorized_keys,修改权限位600;
9.7、企业中ssh连接的三种方案:
1、直接root ssh key:
条件:允许root用户ssh登录,比较不安全;
2、利用sudo提权实现拷贝没有权限用户的拷贝(root用户被禁用的情况下)
[lc@m01 ~]$ scp -P52113 /etc/hosts lc@172.16.1.31:/home/lc/ #只有增量的功能
hosts 100% 360 0.4KB/s 00:00
3、利用ssh隧道模式进行数据的拷贝:
[lc@m01 ~]$ rsync -avz /etc/hosts -e "ssh -p 52113" lc@172.16.1.31:/home/lc/ #增量和加密
[root@m01 ~]# echo ‘lc ALL=(ALL) NOPASSWD:ALL (/usr/bin/rsync) ’ >>/etc/sudoers
[lc@m01 ~]$ ssh -p52113 -t lc@172.16.1.31 sudo rsync -vz ~/hosts /etc/ #使用的是root的权限
4、利用suid来实现拷贝(root用户被禁用的情况下,了解就可以,不用于实际的环境,通过给名利设置suid权限(比较不安全),使得所有的用户都可以像root用户一样使用该用户不能使用的命令,且文件属于当前用户;)
[lc@m01 ~]$ scp -P52113 /etc/hosts lc@172.16.1.31:/home/lc/
hosts 100% 360 0.4KB/s 00:00
[root@nfs01 .ssh]# chmod u+s `which rsync`
[root@nfs01 .ssh]# ls -l `which rsync`
-rwsr-xr-x. 1 root root 414968 4月 30 2014 /usr/bin/rsync
[lc@m01 ~]$ ssh -p52113 lc@172.16.1.31 rsync -avz ~/hosts /etc/ #连接nfs01服务器,拷贝的是原用户属性;
5、批量分发管理脚本(使用sudo进行提权操作,也可以使用saltstack)
[root@m01 ~]$ mkdir -p /server/scripts
[root@m01 ~]$ vim /server/scripts/fenfa.sh
#!/bin/sh
. /etc/init.d/functions
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
for n in 8 31 41;do
scp -P52113 /etc/hosts lc@172.16.1.${n}:/home/lc >/dev/null 2>&1
ssh -p52113 -t lc@172.16.1.${n} sudo rsync -az ~/hosts /etc/hosts >/dev/null 2>&1
if [ $? -eq 0 ];then
action "hosts 172.16.1.$n" /bin/true
else
action "hosts 172.16.1.$n" /bin/false
fi
done
[lc@m01 ~]$ sh /server/scripts/fenfa.sh
9.8、优化ssh服务默认登录配置:
1、更改配置前进行相应的备份:
cp -av /etc/ssh/{sshd_config,sshd_config.ori}
提示:一般来说ssh服务使用默认的配置就已经能够很好的工作了,如果对安全要求不高,仅提供ssh服务的情况下,可以不需要修改任何的更改;
2、相关参数说明:
Port:指定sshd进程监听的端口号,默认是22,可以使用指令监听多个端口,默认将在本机的所有网络接口上监听,
可以通过ListenAddress指定某个特定的接口上监听;
PermitEmptyPasswords:是否允许密码为空的用户远程登录,默认为no
PermitRootLogin:是否允许root登录,yes表示允许(默认),no表示禁止;
without-password:表示禁止使用密码认证登录,默认是不开启的;
forced-commands-only:表示只有在指定了command选项的情况下才允许使用公钥认证登录,同时其他认证方法全部被禁用,这个值常用于做远程备份;
GSSAPIAuthentication :解决linux之间使用ssh远程连接慢的问题;
UseDns:指定sshd是否应该对远程主机名进行反向解析,以检查此主机名是否与其IP地址真实对应,默认值是yes
3、windows服务器的默认远程端口号是3389,管理员用户是administrator,普通用户是guest。linux管理员用户是root,普通用户默认是多个,
远程连接端口是22,这些黑客都知道,为了系统的安全要隐藏或更改上述的配置;
vim /etc/password 里面不用的用户注释掉;
4、优化设置:
vim /etc/ssh/sshd_config
13 Port 52113 #端口号改为52113
15 ListenAddress 172.16.1.61:52113 #设置监听的端口号地址
42 PermitRootLogin no #不允许roo用户ssh登录
65 PermitEmptyPasswords no #不允许用户空密码ssh登录
80 GSSAPIAuthentication no #解决端ssh连接慢的问题;
122 UseDNS no #不使用Dns
[lc@m01 ~]$ sed -i '13 i Port 52113\nListenAddress 172.16.1.61:52113\nPermitRootLogin no\nPermitEmptyPasswords no\nGSSAPIAuthentication no\nUseDNS no' /etc/ssh/sshd_config
5、vimdiff 进行比较:
vimdiff sshd_config sshd_config.ori
6、平滑重启sshd服务:
/etc/init.d/sshd reload
7、进行连接验证:
[root@web01 ~]# ssh -p52113 lc@10.0.0.61 #连接外网网卡,被拒绝
ssh: connect to host 10.0.0.61 port 52113: Connection refused
[root@web01 ~]# ssh -p52113 root@172.16.1.61 #由于设置了禁止root用户登录,所以用root用户不可以登录
root@172.16.1.61's password:
Permission denied, please try again.
[root@web01 ~]# ssh -p52113 lc@172.16.1.61 #登录成功;
lc@172.16.1.61's password:
welcom to lc_linux
[lc@m01 ~]$
#用户可登录后可以使用su - root 切换用户,但是为了更好地保护密码 ,根据不同的用户给于不同的sudo权限是最好的,我这里用visudo设置的权限是(lc ALL=(ALL) NOPASSWD:ALL)
8、此时用户也无法使用scrt进行登录,需要修改scrt中的配置
9、如何防止ssh登录入侵:
使用秘钥登录,不用密码登录
牤牛阵法:解决ssh安全问题
防火墙封闭ssh,指定源ip限制(局域网,信任公网)
开机ssh只监听本地内网ip(ListenAddress 172.16.1.41:52113)
尽量不给服务器外网ip地址
(1)各服务器上都建立了lc用户,并给于sudo (lc ALL= NOPASSWD:ALL )权限,lc就可以看做是管理员;
(2)跳板机服务器和其它服务器建立了ssh秘钥登录,lc用户之间的;
(3)ssh已经优化,监听特定的网卡和端口,不允许root用户登录;
(4)这种设置不影响网络的联通性,只是改变了远程连接的范围,在有外网和内网接到一台服务器的
时候使用最好,如果是纯内网可以不使用;