架设OpenSSH服务器完全日志
 
简介:
        之前在架设telnet服务时提到,telnet服务使用明文来传输数据,存在着严重的安全的隐患,在实际应用中并不推荐使用,而是应该使用经过加密后的才传输数据的安全的终端。OpenSSH就是在不安全的网络环境中采用加密机制来保证传输数据安全的佼佼者之一。
 
OpenSSH的前身是SSH(Secure Shell),它是一种建立在TCP上的网络协议,允许通信双方通过一种安全的通道交换数据,保证数据的安全。OpenSSh的功能有:
 
1. 替代不安全的网络通讯工具(如:telnet);
2. 提高基于口令的安全安全验证和基于密钥的安全验证;
3. 通过端口转发方式传输telnet、VNC等不安全的网络通讯数据,也称为加密隧道传输。
 
 
配置流程:
 
配置环境:

 
服务器
客户端
操作系统
CentOS 5.5
Ubuntu 10.04
Ip地址
192.168.136.128
192.168.136.130
iptables
开启
selinux
开启
 
配置目标:
1. OpenSSH服务器的基本配置与运行;
2. 基于密钥的认证方式登录服务器;
3. 使用端口转发功能(加密隧道)传输telnet服务的数据
 
一.OpenSSH服务器的基本配置与运行:
 
首先,提供了OpenSSH服务的rpm包有:openssh, openssh-clients, openssh-server;确认这些软件包的安装:
yum install openssh openssh-clients openssh-server –y
 

 
软件包安装成功后,有以下重要的文件被安装:
 
OpenSSH的启动进程:/usr/bin/sshd
OpenSSh的启动脚本:/etc/init.d/sshd
配置目录:
全局配置目录:/etc/ssh/*        个人配置目录:$HOME/.ssh/*
ps: sshd的主配置文件是/etc/ssh/sshd_config
 
配置OpenSSH客户端:
 
OpenSSH的核心配置文件时/etc/ssh/ssh_config,内容如下:
 

逐行分析一下:
Host *
Host指令指出一个了主机的范围,随后所有的配置指令只对这个主机范围内的计算机生效,直到碰到下一个Host指令为止,*表示所有的主机;
 
ForwardAgent no
设置与认证服务器的连接是否转发给远程计算机
 
ForwardX11 no
使用Xwindows的用户是否想自动地将x11的会话通过安全通道和DISPLAY设置重定向到远程主机;对于不使用图形界面的计算机就应该设为no
 
RhostsRSAAuthentication no
设置是否使用经过RSA认证的rhosts
 
RSAAuthentication yes
设置是否允许使用RSA认证。为了会话更为安全,应该设置为yes
 
PasswordAuthentication yes
设置是否使用基于密码的认证
 
HostbaseAuthentication no
设置是否使用经过公钥认证的rhosts
 
BatchMode no
设置是否交互式输入用户名和密码,no表示使用交互式输入。在用脚本自动登录时,应该设置为no
 
CheckHostIP yes
设置是否对远程主机的ip地址进行额外的检查以防止DNS欺骗
 
AddressFamily any
设置使用ipv4还是ipv6,any指两个都可使用
 
ConnectTimeout 0
设置与服务器连接时的超时值,0代表永不超时
 
StrictHostKeyChecking ask
设置是否把新连接的主机加到./.ssh/known_hosts文件中,ask表示让用户选择
 
IdentityFile ~/.ssh/identity
IdentityFile ~/.ssh/id_rsa
IdentityFile ~/.ssh/id_dsa
设置从哪个文件读取用户的RSA安全验证标识,可以设置多个
 
Port 22
确定连接到远程主机的端口号
 
Protocol 2,1
以那一种方式支持协议版本。”2,1”表示先试用SSH2,如果失败,使用SSH1
 
Cipher 3des
Cipers aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,arcfour,ase192-cbc,aes256-cbc
设置SSH2允许使用的加密算法。列出的各种算法按次序被选用
 
EscapeChar ~
使用~字符作为ESC键
 
Tunnel no
设置是否使用隧道设备
 
TunnelDevice any:any
强制使用某一隧道设备。any:any表示任何可用设备
 
PermitLocalCommand no
是否允许在SSH中执行本地命令
 
GSSAPIAuthentication yes
确定是否允许使用GSSAPI的用户认证,只用于SSH2
 
ForwardX11Trusted yes
远程X11客户端是否对原来的X11显示有完全的控制权
 
SendEnv….
确定把哪些本地变量发送给服务器,只用于SSH2
 
 
启动OpenSSH的服务:
 
查看sshd服务状态:service sshd status
 
如果还没有启动服务,使用以下命令启动服务:
 
启动sshd服务:service sshd start
Ps:脚本方式启动:/etc/init.d/sshd start      传统Unix管理模式启动:/usr/bin/sshd
 
设置服务开机自启动:chkconfig sshd on
 
 

 OpenSSh使用的默认端口是22,一般iptables防火墙都已经开放该端口:

 
 
注意SERVER-RULES链表中的第7条规则:
 

现在尝试在客户端使用ssh连接服务器,测试成功:
 

在测试连接中发现需要注意的两个问题:

1. 用户第一次连接服务器时会提示主机不可信,这是因为在当前用户家目录下的.ssh/known_hosts文件没有记录该服务器的指纹,连接成功以后就会在该用户的known_hosts文件加入该服务器的指纹;
2. 我的登录用户名是maomao,这需要服务器上也有maomao的账户,如果没有要自行建立:
 
 
 
二. 基于密钥的认证方式登录服务器:
 
认证方式:
openssh支持两种认证方式,一种是基于系统口令的安全验证;一种是基于密钥的安全验证,客户机必须创建一对密钥,把公钥上传到服务器,然后对接时使用自己的私钥解密,这样可以完全地防止假冒服务器的中间人***方式。当然,无论使用何种方式,连接建立的过程中传输的数据都是由ssh加密的。基于系统口令的验证方式上面已经介绍了,现在来学习一个基于密钥的安全验证方式:
 
首先,在客户端生成密钥对,可以是dsa加密,也可以是rsa加密:ssh-keygen -t dsa/rsa
 

过程会询问你存放密钥文件的路径,默认为$HOME/.ssh/id_rsa即可,然后输入密钥的密码,密钥就创建成功了。
 
 
生成的密钥对文件在用户目录下:.ssh/id_rsa(私钥)和.ssh/id_rsa.pub(公钥)
 

 如何将自己的公钥(id_rsa.pub或者id_dsa.pub)上传到服务器呢?

  RH253中提供了一种非常好的方法:
上传公钥给要登录的服务器:
ssh-copy-id -i ~/.ssh/id_dsa.pub XXX.XXX.XXX.XXX(SSH server's ipaddress)
 
上传时输入私钥密码即可。
 
这样以后登录时输入私钥密码登录即可,无需用户密码。
 

这里有个问题,如果使用基于密钥验证的ssh加密信道(例如vnc等),
每次登录都要输入私钥密码有点麻烦,可以使用ssh代理,以后登录一次后的服务器都不用输入密码直接登录了:
 
开启ssh代理:eval $(ssh-agent)
 
为ssh代理提供你的私钥密码: ssh-add,也可以设置开机启动,在startup command中输入/usr/bin/ssh-add,这样每次开机都要输入一次私钥密码,然后关机之前的SSH基于密钥验证的登录都不用输入密码了。
PS:如果第一次连接就出现middle attack问题,很大可能是.ssh/known_hosts的文件问题。例如之前已经建立好的链接,由于服务器重装了系统,此时known_hosts中服务器ip地址一样,但指纹不同了,此时就登录失败,清空该文件即可,或者清空该ip段的指纹:
 
echo “” > $HOME/.ssh/known_hosts
 
 
三. 使用端口转发功能(加密隧道)传输telnet、vnc等不安全服务的数据
 
实际应用中很多网络服务都是不安全的,例如telnet、ftp、pop3等,可以利用ssh的端口转发功能,为这些网络程序在各种tcp端口上建立TCP/IP数据传输进行加密与解密。
 
端口转发有本地转发与远程主机转发两种,本地转发是指在客户机上实现ssh隧道加密,远程主机转发是指远程的服务器为客户端实现ssh隧道加密。实现时二者选一即可。
 
现在以加密telnet服务为例:
 

 
telnet服务器
telnet客户端
操作系统
CentOS 5.5
Ubuntu 10.04
Ip地址
192.168.136.128
192.168.136.130
iptables
开启
selinux
开启
转发端口
——
2323
 
Telnet客户机:192.168.136.130 使用转发端口2323;  
Telnet服务器:192.168.136.128 使用telnet默认端口23。
 
本地转发:
 
在客户机192.168.136.130上开启转发功能:
 
ssh  -L 2323:192.168.136.128:23  root@192.168.136.128
 
解析: 参数-L代表本地转发Local Forward,2323:192.168.136.128:23表示将telnet的链接由本地端口2323转发到服务器的23端口,root@192.168.136.128表示用root的身份登录。
 
登录时输入:telnet 127.0.0.1 2323 即表示:telnet 192.168.136.128 23
 
上述配置也可以在/etc/ssh/ssh_config中加入 "LocalForward 2323:192.168.136.128:23" 实现,上述命令中还有一个-g选项,它表示允许除本机以外的其他计算机使用转发功能,出于安全考虑,应该禁止该功能。
 
远程转发:
 
在服务器1921.168.136.128上开启转发功能:
 ssh -R 2323:192.168.136.128:23 root@192.168.136.130
 
解析:参数-R代表远程转发Remote Forward, 也就是把远程机192.168.136.130的2323端口的连接转发到本机10.10.1.29的23端口,效果与上面的本地转发一样。
 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
测试结果是失败的。
 
直接telnet是没有问题的:
 

经过端口转发后,telnet失败:
 

虽然本机的23端口没有提供telnet服务,但是前面已经设置了ssh转发,连接到本机的2323端口的连接都要转发到服务器的23端口才对,而且是SSH加密的隧道。为什么还是失败呢?经验证防火墙iptables和安全控制系统selinux是无辜的。
 
 
 该问题还在研究中,如果有朋友看到这博文且明白本猫所犯之错,请指出,感谢万分~~