前言
Secure Shell(SSH) 是由 IETF(The Internet Engineering Task Force) 制定的建立在应用层基础上的安全网络协议。它是专为远程登录会话(甚至可以用Windows远程登录Linux服务器进行文件互传)和其他网络服务提供安全性的协议,可有效弥补网络中的漏洞。通过SSH,可以把所有传输的数据进行加密,也能够防止DNS欺骗和IP欺骗。还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。目前已经成为Linux系统的标准配置。
ssh安装及配置文件
SSH分为客户端 openssh-client 和服务器 openssh-server
如果只是想远程登陆别的机器只需要安装客户端,如果要开放本机的SSH服务就需要安装服务器
ssh_config和sshd_config都是ssh服务器的配置文件,二者区别在于,前者是针对客户端的配置文件,后者则是针对服务端的配置文件。 /etc/ssh/ssh_config配置文件中的"Port"设置连接到远程主机的端口(就是你这台机器ssh连接别的机器的默认端口);/etc/ssh/sshd_config配置文件中的"Port"设置sshd监听的端口号(就是别人的机器登录你这台机器的端口)。两个配置文件都允许你通过设置不同的选项来改变客户端程序的运行方式。
ssh基本用法
使用某个用户登录远程主机host
命令:ssh 用户@host
如果本地用户名和远程用户名一致,则登录时可以省略用户名
命令:ssh 用户
ssh的默认端口是22,也就是说,你的登录请求会送进远程主机的22端口。使用-p参数,可以修改这个端口
命令:ssh –p 端口号 用户@host
复制
上行复制(推送)
scp 文件 用户@服务端ip地址:保存路径
下行复制(拉取)
scp -r 用户@服务端ip地址:服务端文件地址 保存路径
SSH验证
SSH有自己的一套验证方式,可以阻拦大部分的攻击,当然如果有人想通过撞库来尝试密码的话,就只有设置防火墙或者做其它的安全措施了。SSH 协议最常见的实现是 OpenSSH,它由 OpenBSD 项目开发,可用于大多数 Linux 和类 Unix 操作系统。一旦你安装了这个软件包,你就会有一个名为sshd_config 的文件来控制该服务的大部分行为。
- 第一种(口令验证)
只要你知道自己帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,危险性能高。
当远程主机的公钥被接受以后,它就会被保存在文件$HOME/.ssh/known_hosts之中。下次再连接这台主机,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。
- 第二种(密匙验证)
需要依靠密匙,也就是你必须为自己创建一对密匙,并把公用密匙放在需要访问的服务器上。如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密匙进行安全验证。服务器收到请求之后,先在该服务器上你的主目录下寻找你的公用密匙,然后把它和你发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用公用密匙加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私人密匙解密再把它发送给服务器。
使用ssh-keygen命令生成密钥对,执行结束以后会在 /home/当前用户 目录下生成一个 .ssh 文件夹,其中包含私钥文件 id_rsa 和公钥文件 id_rsa.pub。
使用ssh-copy-id命令将公钥复制到远程主机。ssh-copy-id会将公钥写到远程主机的~/.ssh/authorized_key 文件中
配置密钥对验证
1.在客户端创建密钥对
通过ssh—keygen工具为当前用户创建密钥对文件。可用的加密算法为RSA、ECDSA或DSA等(ssh—keygen命令的“—t”选项用于指定算法类型)。
ssh-keygen -t ecdsa
Generating public/private ecdsa key pair.
Enter file in which to save the key(/home/admin/.ssh/id ecdsa): @指定私钥位置,直接回车使用默认位置
Created directory '/home/admin/.ssh'. @生成的私钥、公钥文件默认存放在宿主目录中的隐藏目录.ssh/下
Enter passphrase (empty for no passphrase): @设置私钥的密码
Enter same passphrase again: @确认输入
ls -1 ~/.ssh/id_ecdsa*
@id_ecdsa是私钥文件,权限默认为600;id_ecdsa.pub是公钥文件,用来提供给 SSH 服务器
2.将公钥文件上传至服务器
scp ~/.ssh/id_ecdsa.pub root@192.168.142.20:/opt
{(可直接在服务器的/root/.ssh/目录中导入公钥文本)
cd~/.s
ssh-copy-id -i id_ecdsa.pub root@192.168.142.20 }
3.在服务器中导入公钥文本
mkdir /root/.ssh/
cat /opt/id_ecdsa.pub >> /root/.ssh/authorized_keys
cat /root/.ssh/authorized_keys
4.在客户端使用密钥对验证
ssh root@192.168.142.20
Enter passphrase for key '/home/admin/.ssh/id_ecdsa': @输入私钥的密码
5.在客户机设置ssh代理功能,实现免交互登录
ssh-agent bash
ssh-add
Enter passphrase for /home/admin/.ssh/id_ecdsa: @输入私钥的密码
ssh zhangsan@192.168.142.20
在客户端创建密钥对
在服务器中导入公钥文本
在客户机设置ssh代理功能,实现免交互登录
TCP_Wrappers
TCP_Wrappers是一个工作在第四层(传输层)的的安全工具,对有状态连接的特定服务进行安全检测并实现访问控制,凡是包含有libwrap.so库文件的的程序就可以受 TCP_Wrappers 的安全控制。 它的主要功能就是控制谁可以访问,常见的程序有rpcbind、vsftpd、sshd,telnet。 TCP_Wrappers有一个TCP的守护进程叫作tcpd。 以ssh为例,每当有ssh的连接请求时,tcpd即会截获请求,先读取系统管理员所设置的访问控制文件,符合要求,则会把这次连接原封不动的转给真正的ssh进程,由ssh完成后续工作;如果这次连接发起的ip不符合访问控制文件中的设置,则会中断连接请求,拒绝提供ssh服务。
TCP_Wrappers的使用主要是依靠两个配置文件/etc/hosts.allow , /etc/hosts.deny,用于拒绝和接受具有TCP_Wrappers控制的程序,默认情况下,这两个文件什么都没有添加,所以没有限制。
TCP Wrappers 的访问策略
TCP Wrappers 机制的保护对象为各种网络服务程序,针对访问服务的客户端地址进行访问控制。
通过/etc/hosts.allow,/etc/hosts.deny 这两个文件来管理的一个类似防火墙的机制,分别用来设置允许和拒绝的策略。
TCP Wrappers 保护机制的两种实现方式
- 直接使用 tcpd 程序对其他服务程序进行保护,需要运行 tcpd 程序。
- 由其他网络服务程序调用 1ibwrap.so.*动态函数库,不需要运行 tepd 程序,此方式的应用更加广泛,也更有效率。
格式:
<服务程序列表>:<客户端地址列表>
- 服务程序列表
ALL:代表所有的服务。
单个服务程序:如“vsftpd"。
多个服务程序组成的列表:如“vsftpd,sshd". - 客户端地址列表
ALL:代表任何客户端地址 ;LOCAL:代表本机地址;多个地址以逗号分隔;
允许使用通配符“* ”和“?”,前者代表任意长度字符,后者仅代表一个字符
网段地址,如“192.168.142.”或者 192.168.142.0/255.255.255.0(掩码只支持 netmask的地址显示方式)
区域地址,如“.apple.com"匹配 apple.com 域中的所有主机。
TCP Wrappers 机制的基本原则
首先检查/etc/hosts.allow文件,如果找到相匹配的策略,则允许访问:
否则继续检查/etc/hosts.deny文件,如果找到相匹配的策略,则拒绝访问:
如果检查上述两个文件都找不到相匹配的策略,则允许访问。
“允许所有,拒绝个别” 只需在/etc/hosts.deny文件中添加相应的拒绝策略
“允许个别,拒绝所有” 除了在/etc/hosts.allow中添加允许策略之外,还需要在/etc/hosts.deny文件中设置“ALL:ALL”的拒绝策略
实列:只希望从ip地址为192.168.142.10的主机或者位于192,168.142.20的主机(访问192.168.142.0网段的服务配置文件改为(sshd:192.168.142.0/255.255.255.0))访问sshd服务,其他地址被拒绝
结束语:SSH在网络环境中对优化环境起到了重要作用,了解原理及其配置也是我们值得学习的,在生产环境中有很大的便捷之处。