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连接原理的更多相关文章

  1. linux系统ssh远程连接检查脚本

    脚本用于检查Linux系统云服务器出现的常见远程不能连接问题,脚本可以提前放到服务器里,出现问题时可以web vnc登陆上去执行试试. 附:管理控制台终端web vnc 方式登录,参考:http:// ...

  2. 虚拟机virtualBox安装linux系统 xshell远程连接linux

    虚拟机virtualBox安装linux系统 xshell远程连接linux 虚拟机概念: 通过软件, 使用虚拟化技术虚拟出电脑的硬件环境, 充当真实的电脑使用. 常见的虚拟软件: virtualBo ...

  3. 在Linux系统下远程连接oracle的防火墙设置

    在Linux系统要远程连接Oracle的防火墙设置方法: 打开5801至5810 端口用于vnc iptables -I INPUT -p tcp --dport 5801:5810 -j ACCEP ...

  4. Linux使用SSH远程连接方式和更改密码 ,自己空间转移过来的。

    一. 远程连接Linux系统需要一个方便的SSH连接工具putty就不错!工具在本日志的附件下载,解压密码是QQ号,云盘访问密码 90891.把远程主机ip和端口号填写上然后选择连接方式为“SSH”. ...

  5. 创建SSH Key连接github或gitlab

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

  6. Linux系统的Cache工作原理和管理机制

    Linux系统Cache 管理是 Linux 内核中一个很重要并且较难理解的组成部分.本文详细介绍了 Linux 内核中文件 Cache 管理的各个方面,希望能够帮助到你. 操作系统和文件 Cache ...

  7. linux系统文件属性-硬连接、软连接

    1 硬链接概念 硬链接是指通过索引节点(Inode)来进行链接,在Linux(ext2,ext3)文件系统中,保存在磁盘分区中的文件不管是什么类型都会给它分配一个编号,这个编号被称为索引节点编号(In ...

  8. 本地ssh key连接多个git账号

    在开发过程中,可能需要在本地同时连接到多个gitlab账户,但是一个用户的ssh key只能连接到一个git账户,这就需要创建多个ssh key,分别连接到不同的账户.具体步骤如下: 1.生成ssh ...

  9. 修改Linux的SSH远程连接端口 技巧

    将SSH终端服务的端口由 22 修改为别的端口以防攻击黑客直接猜解您的服务器密码 首先修改配置文件 vi /etc/ssh/sshd_config 找到 #Port 22 一段,这里是标识默认使用 2 ...

  10. SSH Key连接github提示Permission denied (publickey).错误

    root@debian64:/home/xiaoliuzi/.ssh/key_backup# ssh -T git@github.com The authenticity of host 'githu ...

随机推荐

  1. Mike Gancarz:Linux/Unix设计思想

           Mike Gancarz是一位技术布道者. 他是Linux/Unix最基本的倡导者之中的一个,也是最早开发X Window System的先驱.他把一些在Unix/Linux社区里口口相 ...

  2. Cocostudio学习笔记(2) Button + CheckBox

    这篇记录了两个控件的使用流程:Button 和 CheckBox. ------------------------------------------------------------------ ...

  3. 使用HTML5 的跨域通信机制进行数据同步

    离线应用系统的设计目标就是在网络离线情况下依然可以操作我们的应用系统,并在网络畅通的情况下与服务器进行数据交互. 所以离线应用系统最终会做成类似C/S架构的客户端应用程序.这边基于Chrome或者 S ...

  4. linux系统socket通信编程1

    Linux下的Socket编程大体上包括Tcp Socket.Udp Socket即Raw Socket这三种,其中TCP和UDP方式的Socket编程用于编写应用层的socket程序,是我们用得比较 ...

  5. php学习八:封装

    一:在php中,用class关键字来创建一个类,即进行封装:在类里面有成员属性和方法行为组成: 1.成员属性:用关键字var来声明,可以给初始值也可以不给;现在var废弃,用public来声明,pub ...

  6. Android 简单案例:onSaveInstanceState 和 onRestoreInstanceState

    import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widg ...

  7. 从一个多项目Web工程看Eclipse如何导入Gradle项目

    这里再次说一下为什么我们需要熟悉Gradle构建工具,主要原因就是很多开源项目现在都在改用Gradle作为构建工具.一部分的github上的示例代码也在用Gradle构建,如果还是只能用maven,那 ...

  8. 输入一个网站地址到网站展现的过程以及APR协议(鬼知道中间经历了什么)

    以前只知道输入一个网站,然后看着返回琳琅满目的内容,其实中间经历的过程和步骤太多了.为了满足好奇心以及学习需要,特查阅了资料将其记录下来以备后续自己复习. 从我在地址栏输入www.zhihu.com ...

  9. oracle的认证方式

    使用as sysdba是使用操作系统验证方式,不需要输入密码

  10. pta 习题集 5-14 求n以内最大的k个素数以及它们的和

    本题要求计算并输出不超过n的最大的k个素数以及它们的和. 输入格式: 输入在一行中给出n(10≤≤n≤≤10000)和k(1≤≤k≤≤10)的值. 输出格式: 在一行中按下列格式输出: 素数1+素数2 ...