SSH是一种客户端连接,在Linux服务器下通过远程的方式将本地电脑连接到对方的电脑上。
远程连接的方式:
(1)telnet命令(为明文传输,不安全)
(2)(2)SSH(加密传输,安全)
操作的两台服务器都需要安装scp软件包(openssh-clients)
(1)telnet命令(为明文传输,不安全)
两台服务器安装telnet
# telnet 192.168.214.129 22
表示连接成功
通过这种方式可以判断对方的端口是否开启(常在脚本中使用)
(2)SSH(加密传输,安全)
# ssh 192.168.214.129 (默认超级用户)
# ssh [email protected]
# netstat -antup | grep 22
SSH结构
SSH服务端是一个守护进程(daemon),它在后台运行并响应来自客户端的连接请求。SSH服务端的进程名为sshd,负责实时监听远程SSH客户端的连接请求,并进行处理,一般包括公共密钥认证,密钥交换,对称密钥加密和非安全连接等。这个SSH服务就是我们前面基础系统优化中保留开机自启动的服务之一。
ssh客户端包含ssh以及像scp(远程拷贝),slogin(远程登录),sftp(安全FTP文件传输)等应用程序。
ssh的工作机制大致是本地的ssh客户端先发送一个连接请求到远程的ssh服务端,服务端检查连接的客户端发送的数据包和IP地址,如果确认合法,就会发送密钥发回给服务端,自此连接建立。
基于密钥的安全验证(密钥的权限认证必须是700)
ssh-keygen是生成密钥对的命令(rsa指加密算法)
ssh-copy-id是分发密钥对的命令
(1)客户端创建密钥
# ssh-keygen是生成密钥对的命令(rsa指加密算法)
回车
密钥对密码,不是Linux登录密码,有了密钥对可以不输密码进行登录,也可以在密钥对的基础上再加一层密码
若不设密钥对密码,直接回车(空密码),再次输入仍不设密码
(2)将公钥id_rsa.pub文件复制到另外一台服务器(服务端)的用户家目录下的.ssh目录下
(服务端)
# ls ~/.ssh
known_hosts文件是记录连接过的IP(清空该记录就会再次弹出yes/no)
密钥的目录权限或文件权限过大,连接就会失败(因为权限过大,Linux担心影响安全,所以不会成功)
(服务端)
# mkdir .ssh/
# chmod 700 .ssh/
(客户端)
# scp .ssh/id_rsa.pub 192.168.214.129:~/.ssh/
scp的基本参数
-P(大写):接端口,默认22
-r:递归,表示拷贝目录
-p:表示在拷贝前后保持文件或目录属性
-l limit:限制速度
(3)将拷贝过去的id_rsa.pub文件里的内容追加到~/.ssh/authorized_key文件里
(服务端)
# cd .ssh
# cat id_rsa.pub > authorized_keys
(4)此时回到第一台服务器进行远程SSH连接
(客户端)
# ssh 192.168.214.129
若在普通用户下的.ssh目录下也添加公钥并改名为authorized_key,也可免密钥登录
(客户端)
# scp ~/.ssh/id_rsa.pub [email protected]:~
普通用户的家目录下没有.ssh目录,放在家目录下即可
(服务端)
# cd /home/daisy
# touch authorized_keys
# chown daisy authorized_keys
# cat id_rsa.pub > authorized_keys(操作若失败,将authorized_keys的权限改为600)
# mkdir .ssh
# mv authorized_keys .ssh/
# chmod 700 .ssh/
# chown -R daisy.daisy .ssh/ (-R 递归授权)
(客户端)
# ssh [email protected]
非交互式免密钥登录
# ssh-keygen -t dsa -f ~/.ssh/id_dsa -P ""
通过ssh-copy-id进行公钥的自动分发
(客户端)
# ssh-copy-id -i ~/.ssh/id_dsa.pub [email protected]
(服务端)
(客户端)
# ssh [email protected]
自动免密钥登录(sshpass公网安装)
# sshpass -p "123456" ssh-copy-id -i ~/.ssh/id_dsa.pub [email protected]
若known_hosts文件内容清空,不想屏幕出现yes/no选项时
通过sshpass+ssh-keygen+ssh-copy-id进行免交互的SSH密钥批量分发
# sshpass -p "123456" ssh-copy-id -i ~/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no [email protected]"
/etc/ssh/ssh_config配置文件中将 StrictHostKeyChecking=yes改为no,重启sshd
StrictHostKeyChecking=no
SSH基于密钥的安全认证总结
1)如果我们要进行免密码的SSH连接,那么在创建密钥对的时候不输入任何密码就可以了。
2)SSH基于密钥的安全认证的本质其实就是将密钥对中的公钥里的内容拷贝到对方服务器的用户家目录下的.ssh目录里的authorized_keys文件里。
3)你想要和对方服务器的哪个用户进行密钥对认证,那么你就要把公钥拷到对方该用户的家目录下的.ssh目录里的authorized_keys文件里(如果是想和普通用户进行密钥对登录,需要拷贝到/home目录下的该用户家目录下。)
4)ssh-keygen -t参数可以指定密钥对的加密类型。如果不指定默认rsa加密
排故:
若出现远程传输数据缓慢的情况,对双方的/etc/ssh/sshd_config进行修改
(1)# vim /etc/ssh/sshd_config
(2)# service sshd reload
如果端口已修改为特殊端口,那么用上面的命令连接就会发生问题
报错字符串对应的可能问题:
1,no route to host 可能为防火墙影响
2,Connection refused可能为防火墙
Connection refused 还可能是连接的对端服务没开或者端口改变了。
13 #Port 22
#ssh连接默认端口22
15 #ListenAddress 0.0.0.0
#设置sshd服务监听的客户端IP地址范围
42 #PermitRootLogin yes
# 是否允许root用户远程登录
65 #PermitEmptyPasswords no
#是否允许空密码
81 GSSAPIAuthentication yes
#是否关闭GSSAPI认证
122 #UseDNS yes
#是否使用DNS
1)一旦修改了Port,那么ssh登录时就需要-p指定端口号,不然会登录失败,ssh默认登录22端口
3)一旦修改了ListenAddress,监听地址,那么不再地址范围内的所有客户端将无法远程连接服务器。
4)一旦 PermitRootLogin no 被启用,那么root账户将不能够进行ssh远程登录。
5)一旦启用了PermitEmptyPasswords yes,那么所有无密码的用户也就可以远程登录了,并且还是免密码的方式。
6)UseDNS no :建议用no,不需要对DNS进行反向解析,可以加快ssh连接速度。
7)修改配置文件后,需要重启sshd服务才能生效
ssh-key自动批量分发脚本要求:
如果客户机伪装openssh-clients或sshpass,那么,脚本需要能够自动搭建本地yum仓库及云yum仓库,自动化安装
脚本自动判断某网段内所有的存活IP(ping -c 1 IP地址)
对所有存活IP进行密钥对批量分发
汇报分发完成情况
#!/bin/bash
Wget1=http://mirrors.aliyun.com/repo/epel-6.repo
Wget2=http://mirrors.163.com/.help/CentOS6-Base-163.repo
umount /dev/cdrom &>/dev/null
[ -d /media/cdrom ]|| mkdir -p /media/cdrom
mount /dev/sr0 /media/cdrom &>/dev/null
if [ $? -ne 0 ];then
echo "please check cd!"
exit
fi
[ -d /etc/yum.repos.d ]|| mkdir -p /etc/yum.repos.d
cd /etc/yum.repos.d
mv * /tmp
cat > /etc/yum.repos.d/local.repo << FOF
[local]
name=local
baseurl=file:///media/cdrom
gpgcheck=0
enabled=1
FOF
yum -y clean all &>/dev/null
[ $? -eq 0 ] && echo "cleaned successfully"
yum makecache &>/dev/null
[ $? -eq 0 ] && echo "yum installed successfully" || echo "install failed"
which wget
if [ $? -ne 0 ];then
yum -y install wget &>/dev/null
if [ $? -ne 0 ];then
echo "install failed"
exit
fi
wget -O /etc/yum.repos.d/epel.repo $Wget1
if [ $? -ne 0 ];then
echo "aliyun install failed"
exit
fi
wget -O /etc/yum.repos.d/163.repo $Wget2
if [ $? -ne 0 ];then
echo "163 install failed"
exit
fi
else
wget -O /etc/yum.repos.d/epel.repo $Wget1
if [ $? -ne 0 ];then
echo "aliyun install failed"
exit
fi
wget -O /etc/yum.repos.d/163.repo $Wget2
if [ $? -ne 0 ];then
echo "163 install failed"
exit
fi
fi
yum -y install openssh-clients &>/dev/null
[ $? -eq 0 ] && echo "scp install successfully" || exit
yum -y install sshpass &>/dev/null
[ $? -eq 0 ] && echo "sshpass install successfully"
Path=/tmp
for IP in 192.168.214.{1..254}
do
ping -c 1 -i 0.1 $IP &>/dev/null
if [ $? -eq 0 ];then
echo "$IP alive"
ssh-keygen -t dsa -f ~/.ssh/id_dsa -P ""
sshpass -p "123456" ssh-code-id -i ~/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no $IP"
mv ~/.ssh $Path/.ssh$IP
fi
done
SSH入侵案例
一,事件回顾
这次的服务器被入侵是一个典型的弱密码导致的入侵事件,由于某人员的疏忽,在某台服务器上新建了test用户,且使用同名的弱密码,以便于调试工作所需的脚本工具,就在当天在做脚本调试的时候发现了某些异常的错误,使用root用户无法ssh远程登陆其他服务器,同时scp命令出现异常无法使用,但其他服务器可以使用scp将文件拷贝到该服务器,之后将问题反馈给运维人员,由我们运维进行排查。
二,排查过程
收到问题反馈,主要涉及ssh相关的问题后,我们运维对该服务器进行排查,发现使用ssh -v中的openssl版本无法显示,且输出的帮助信息与其他服务器不一致,然后查看ssh配置,发现配置文件(ssh_config和sshd_config)文件已更新,其内容被全部注释,这时还没有意识到被入侵,悲哀+1,起初以为同事对该服务器做了升级了ssh版本,后来确认无升级之类的操作。
(1)查看ssh版本
# ssh -v
(2)查看ssh进程及其相关文件,ssh和sshd进程文件已更新,ssh_config和sshd_config配置文件已更新,配置文件内容全部注释,ssh_host_key和ssh_host_key.pub为新增文件,其他服务器没有这两个文件。
(3)继续排查,将一台正确的配置文件覆盖至该服务器,重启ssh服务后,使用ssh命令发现无法识别该配置文件中的参数(到这里其实应该发现ssh进程文件已被篡改,使用md5sum做比对即可)
(4)由于其他工作事务需要及时处理,排查这个事情就被搁置了,直至之后的YY讨论问题拿出来询问了下大神,才意识到有被入侵的可能
(5)询问操作过该服务器的同事,此前正在调试脚本工具,新增了test用户,得知其密码为test
(6)进行深入排查,使用chkrootkit -q查看Linux系统是否存在后门,发现有异常。协同之前操作test用户的同事,查找history命令记录,发现一条可疑命令
(7)在另外一台服务器上,发现某账号家目录下有个dead.letter文件,用于将获取到的信息(系统信息,IP地址,账号密码等)发送至指定的邮箱
(8)又在另外一台服务器上部署了一套可疑的程序,估计是作为肉鸡功能
(9)找到/usr/include/statistics为主程序的目录,其中update为主程序,通过autorun脚本进行部署,执行crond伪装成crond服务,使原crond服务隐藏且无法启动,将cron覆盖至原有crontab文件来每分钟执行update二进制程序,mech.pid记录伪装的crond程序的PID
三、清理工作
紧急修复清理
将准备好的正常的ssh相关文件上传至被入侵服务器的/tmp目录下
(1)查看并修改属性
(2)恢复ssh和sshd
(3)删除多余的文件以及恢复crond
后续安全工作
(1)修改所有设计的服务器的账户密码,之后其他使用同类密码的服务器也许改掉
(2)配置防火墙策略,只允许公司外网IP可ssh访问服务器
(3)对弈被入侵的服务器系统后期逐步重做系统,避免存在未清理的后门
四,总结
此次的遭受攻击,问题主要是运维安全意识较差,以及防火墙策略比较松散,为了便于远程工作,像ssh端口未做限制,服务器几乎是裸奔的状态。经过此番折腾,也对服务器安全方面做了一次警示,需加强防御工作,同时也了解到典型的ssh后门功能:其一是超级密码隐身登陆;其二是记录登陆的账号密码。后续还需制定一系列入侵检测机制,以防再次出现入侵事故。
如何防止SSH登录入侵小结:
病毒通常在
(1)各种开机自启动里面放着
/etc/rc.local /etc/init.d/
(2)定时任务
/var/spool/cron/*
(3)系统的定时任务目录
如何防止SSH登录入侵
(1)用密钥登录,不用密码登录
(2)防火墙封闭SSH,指定源IP限制(局域网,信任公网)
(3)开启SSH只监听本地内网IP(ListenAddress10.0.0.8)
(4)尽量不给服务器外网IP
(5)最小化软件安装
(6)给系统的重要文件或命令做一个指纹
(7)给他锁上chattr +i +a
IT公司企业级批量分发管理
(1)中小企业最基本实用的SSH-KEY密钥的方案(key+expect,脚本+sudo,ssh key(密钥认证)+ansible)
(2)门户网站PUPPET(复杂,太重)
(3)赶紧、小米、SALTSTACK批量管理
主机名 |
网卡eth0 |
网卡eth1 |
用途 |
m01 |
10.0.0.61 |
172.16.1.61 |
中心批发服务器 |
nfs01 |
10.0.0.31 |
172.16.1.31 |
接收节点服务器 |
web01 |
10.0.0.8 |
172.16.1.8 |
接收节点服务器 |
backup |
10.0.0.41 |
172.16.1.41 |
备份服务器 |
要求所有服务器在同一用户chensiqi系统用户下,实现A机器从本地分发数据到B,C机器上,发到B,C的过程中不需要系统提示输入密码验证,当然,除了分发的功能,还可以批量查看所有客户机上的CPU,LOAD,MEM,系统版本信息。
即实现从A服务器发布数据到B,C客户端服务器以及查看信息的免密码登录验证解决方案:分发数据流方向如下:
A ---->B
A ---->C
A ---->D