Linux系统——ssh-key连接原理
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 daisy@192.168.214.129
# 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 daisy@192.168.214.129:~
普通用户的家目录下没有.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 zyd@192.168.214.129
非交互式免密钥登录
# ssh-keygen -t dsa -f ~/.ssh/id_dsa -P ""
通过ssh-copy-id进行公钥的自动分发
(客户端)
# ssh-copy-id -i ~/.ssh/id_dsa.pub zyd@192.168.214.129
(服务端)
(客户端)
# ssh zyd@192.168.214.129
自动免密钥登录(sshpass公网安装)
# sshpass -p "123456" ssh-copy-id -i ~/.ssh/id_dsa.pub zyd@192.168.214.129
若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 zyd@192.168.214.129"
/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
Linux系统——ssh-key连接原理的更多相关文章
- linux系统ssh远程连接检查脚本
脚本用于检查Linux系统云服务器出现的常见远程不能连接问题,脚本可以提前放到服务器里,出现问题时可以web vnc登陆上去执行试试. 附:管理控制台终端web vnc 方式登录,参考:http:// ...
- 虚拟机virtualBox安装linux系统 xshell远程连接linux
虚拟机virtualBox安装linux系统 xshell远程连接linux 虚拟机概念: 通过软件, 使用虚拟化技术虚拟出电脑的硬件环境, 充当真实的电脑使用. 常见的虚拟软件: virtualBo ...
- 在Linux系统下远程连接oracle的防火墙设置
在Linux系统要远程连接Oracle的防火墙设置方法: 打开5801至5810 端口用于vnc iptables -I INPUT -p tcp --dport 5801:5810 -j ACCEP ...
- Linux使用SSH远程连接方式和更改密码 ,自己空间转移过来的。
一. 远程连接Linux系统需要一个方便的SSH连接工具putty就不错!工具在本日志的附件下载,解压密码是QQ号,云盘访问密码 90891.把远程主机ip和端口号填写上然后选择连接方式为“SSH”. ...
- 创建SSH Key连接github或gitlab
mac下用SoureceTree下载github或gitlab上的项目时,需要进行ssh key验证.每次重装系统啥的都要重新弄,我在csdn上看到一篇不错的文章.转载一下,以后自己找起来也方便. 地 ...
- Linux系统的Cache工作原理和管理机制
Linux系统Cache 管理是 Linux 内核中一个很重要并且较难理解的组成部分.本文详细介绍了 Linux 内核中文件 Cache 管理的各个方面,希望能够帮助到你. 操作系统和文件 Cache ...
- linux系统文件属性-硬连接、软连接
1 硬链接概念 硬链接是指通过索引节点(Inode)来进行链接,在Linux(ext2,ext3)文件系统中,保存在磁盘分区中的文件不管是什么类型都会给它分配一个编号,这个编号被称为索引节点编号(In ...
- 本地ssh key连接多个git账号
在开发过程中,可能需要在本地同时连接到多个gitlab账户,但是一个用户的ssh key只能连接到一个git账户,这就需要创建多个ssh key,分别连接到不同的账户.具体步骤如下: 1.生成ssh ...
- 修改Linux的SSH远程连接端口 技巧
将SSH终端服务的端口由 22 修改为别的端口以防攻击黑客直接猜解您的服务器密码 首先修改配置文件 vi /etc/ssh/sshd_config 找到 #Port 22 一段,这里是标识默认使用 2 ...
- SSH Key连接github提示Permission denied (publickey).错误
root@debian64:/home/xiaoliuzi/.ssh/key_backup# ssh -T git@github.com The authenticity of host 'githu ...
随机推荐
- easyui------dialog如何固定位置
转载: http://blog.csdn.net/dhdhdh0920/article/details/7438272 代var default_left; var default_top; $('# ...
- C语言中do...while(0)的妙用-避免goto
使用goto的优雅并避免结构的混乱 将要跳转到的语句用do{-}while(0) 包起来就可以. reference #defien N 10 bool Execute() { // 分配资源 int ...
- 超全面的JavaWeb笔记day09<Servlet&GenericServlet&HttpServlet&ServletContext>
1.Servlet概述 2.Servlet接口 3.GenericServlet 4.HttpServlet 5.Servlet细节 6.ServletContext(重要) Servlet概述 生命 ...
- day13<常见对象+>
常见对象(StringBuffer类的概述) 常见对象(StringBuffer类的构造方法) 常见对象(StringBuffer的添加功能) 常见对象(StringBuffer的删除功能) 常见对象 ...
- 【RF库测试】Variable Should not Exist & variable should exist
Variable Should not Exist variable should exist
- Linux 虚拟终端:screen
screen 是一个虚拟终端,我们可以把执行时间很长的命令放在虚拟终端中执行,即使终端断开,这个虚拟终端也会在后台执行 [root@localhost ~]$ yum install -y scree ...
- Android的读写文件及权限设置
drwx read write excute openFileOutput(name,drwx); 用系统api读取文件 设置文件生成的权限: public static boolean sav ...
- unix:/tmp/php-cgi.sock
为什么要用unix:/tmp/php-cgi.sock,最主要的特征就是unix socket比tcp快,当网站流量大的时候,服务器的优化是分毫必争的. 当我们用php-fpm来管理我们的php启动时 ...
- 基于Cocos2d-x学习OpenGL ES 2.0系列——OpenGL ES渲染之Shader准备(7)
Cocos2d-x底层图形绘制是使用OpenGL ES协议的.OpenGL ES是什么呢? OpenGL ES(OpenGl for Embedded System)是OpenGL三维图形API的子集 ...
- 进程保护--CrossThreadFlags标志位
原理: 1. 将进程的所有线程的线程CrossThreadFlags标志位设置成Terminated或者System. 效果:任务管理器,WSYSCheck,ICESWORD无法结束进程.. 但PCH ...