一、SSH简介
SSH(Secure Shell)是以远程联机服务方式操作服务器时的较为安全的解决方案。它最初由芬兰的一家公司开发,但由于受版权和加密算法的限制,很多人转而使用免费的替代软件OpenSSH。
SSH作用:用户通过SSH可以把所有传输的数据进行加密,使“中间人”的攻击方式不可能实现,而且也能够防止DNS和IP欺骗。它还有一个额外的好处是传输的数据是经过压缩的,可以加快传输的速度。SSH作用广泛,既可以代替Telnet,又可以为FTP、POP,甚至为PPP提供一个安全的“通道”。SSH协议在预设的状态中,提供两个服务器功能:一个是类似Telnet的远程联机使用Shell服务器,即俗称SSH功能;另一个是类似FTP服务的SFTP-Server功能,可提供更安全的FTP服务。
二、基于密钥安全认证的工作原理
基于密匙的安全验证需要依靠密匙,即用户必须为自己创建一对密匙,并把公用密匙放在需要访问的服务器上。如果要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用密匙进行安全验证。服务器收到请求之后,先在该服务器的home目录下寻找公用密匙,然后把它和发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用公用密匙加密“质询”(challenge),并把它发送给客户端软件。客户端软件收到“质询”后,就可以用私人密匙解密再把它发送给服务器。使用这种方式,用户必须知道自己密匙的口令。与第一种级别相比,这种级别不需要在网络上传送口令,不仅加密所有传送的数据,而且阻止了“中间人”攻击方式。
三、OpenSSH
OpenSSH的英文全称是Open Secure Shell,即开源SSH,是一个免费、开源的并集远程管理、远程数据传输于一身的管理工具。其工作原理基本和前面所介绍的一致,由于OpenSSH是基于C/S架构的所以在yum安装时要同时安装以下安装包:openssh-server、openssh以及openssh-clients,用来避免由于软件包的未安装导致服务端与客户端双向通信错误。
1、基于OpenSSH的密钥认证登录远程主机
首先使用ssh-keygen命令来生成密钥对,比如要用RSA加密算法生成一个4096Bit的密钥对可以输入如下命令:
[root@hpf-linux ~]# ssh-keygen -t rsa -b 4096 Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): # (密钥对将要存的路径,括号内为默认) Enter passphrase (empty for no passphrase): #(输入口令) Enter same passphrase again: #(再次输入口令,千万不要忘记否则就只有从新生成密钥了) Your identification has been saved in /root/.ssh/id_rsa. #(你的私钥) Your public key has been saved in /root/.ssh/id_rsa.pub. #(你的公钥) The key fingerprint is: b4:b6:76:9f:af:9a:9c:b9:b0:db:d8:96:60:9e:ef:58 root@hpf-linux The key's randomart image is: +--[ RSA 2048]----+ | | | | | . | | . . | | S | | .o. | | o+oE. | | .o@o= . | | ==%o+o. | +-----------------+ [root@hpf-linux ~]# ls .ssh/ id_rsa id_rsa.pub known_hosts [root@hpf-linux ~]# ls .ssh/id_rsa -l -rw------- 1 root root 1743 7月 31 00:47 .ssh/id_rsa
然后进行密钥的分发:刚才生成了一对密钥,为保证安全把私钥放在自己的机器上的~/.ssh/目录下并保证访问权限是“-rw-------”(即600)。同时提前在远程主机上所需要登录用户家目录下的 .ssh/目录中建立authorized_keys文件,在用ssh-copy-id+远程主机上的用户@IP命令把自己刚才所生成的公钥同步到远程主机的authorized_keys文件中,最后就可以用ssh+远程IP命令在输入刚才生成私钥的密码就能登录远程主机了。
[root@webserver ~]# touch .ssh/authorized_keys //提起创建好保存公钥的文件 [root@webserver ~]# chmod 600 .ssh/authorized_keys //保证不让别人看见
[root@hpf-linux ~]# ssh-copy-id //将本机的公钥复制到服务端,需提前在服务端创建authorized_keys文件 [email protected]'s password: (这是远端服务器的密码,输完这次之后今后用密钥认证就不用在输入) Now try logging into the machine, with "ssh '[email protected]'", and check in: .ssh/authorized_keys to make sure we haven't added extra keys that you weren't expecting. [root@hpf-linux ~]# ssh 192.168.1.20 Enter passphrase for key '/root/.ssh/id_rsa': (这是我在生成密钥时在私钥上设置的密码,若闲麻烦可以不用) Last login: Fri Jul 31 02:26:36 2015 from 192.168.1.8
在使用ssh命令登录远程主机时由于ssh登录远程主机的默认端口为22,在生产环境中是不会使用此端口进行通信的,所以若知道远程主机端口已被更改可以使用-p +更改后的端口进行登录。
2、scp命令应用
此命令类似于cp命令,是基于ssh协议跨主机复制的命令,其应用分为以下两种:
源文件在本机,目标为远程:
scp /path/to/somefile .... Username@HOST:/path/to/somewhere
源文件在远程,目标在本机:
scp Username@HOST:/path/to/somefile /path/to/somewhere
常用的命令选项有以下:
-r:当源文件为目录,以实现递归复制
-p:保留源文件的复制及修改时间戳,以及权限
-q:静默模式
-P:PORT:指定服务器端口
应用举例,把本机的shell目录复制到远程主机192.168.1.20上,并保留时间戳:
[root@hpf-linux ~]# stat shell File: "shell" Size: 4096 Blocks: 8 IO Block: 4096 目录 Device: 805h/2053d Inode: 392467 Links: 2 Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2015-07-31 21:23:33.684000145 +0800 Modify: 2015-07-31 21:22:59.033982958 +0800 Change: 2015-07-31 21:22:59.033982958 +0800 [root@hpf-linux ~]# scp -rp shell 192.168.1.20:/root Enter passphrase for key '/root/.ssh/id_rsa': cpcom.sh 100% 483 0.5KB/s 00:00 cpcmd.sh 100% 500 0.5KB/s 00:00 jingxiang.sh 100% 3249 3.2KB/s 00:00 下面检查同步到远程主机的shelll目录,查看时间戳是否改变。 [root@webserver ~]# stat shell File: "shell" Size: 4096 Blocks: 8 IO Block: 4096 目录 Device: 805h/2053d Inode: 534359 Links: 2 Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2015-07-31 21:23:33.000000000 +0800 Modify: 2015-07-31 21:22:59.000000000 +0800 Change: 2015-07-31 21:23:33.166006257 +0800
3、sftp命令的使用
此命令是基于ssh的ftp协议,在使用前要确保远程主机的ssh支持此协议,具体查看如下:
[root@webserver ~]# tail -5 /etc/ssh/sshd_config #Banner none # override default of no subsystems Subsystem sftp /usr/libexec/openssh/sftp-server //远程主机必须有此配置选项
应用举例,用sftp命令到远程主机192.168.1.20,然后将远程主机上的passwd文件下载到指定的本机/tmp目录下:
[root@hpf-linux ~]# sftp 192.168.1.20 Connecting to 192.168.1.20... Enter passphrase for key '/root/.ssh/id_rsa': sftp> ls anaconda-ks.cfg install.log install.log.syslog lvm2-2.02.111-2.el6_6.1.i686.rpm shell sftp> cd /etc //到远程主机的etc目录下 sftp> pwd Remote working directory: /etc sftp> lcd /tmp //将下载到的地址改为tmp目录 sftp> get passwd Fetching /etc/passwd to passwd /etc/passwd 100% 1265 1.2KB/s 00:00 sftp> bye [root@hpf-linux ~]# tail -2 /tmp/passwd mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin [root@hpf-linux ~]# tail -2 /etc/passwd sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin mockbuild:x:500:500::/home/mockbuild:/bin/bash
用sftp命令进入远程主机进行操作还有很多,这里只是简单的下载上传的使用,若要继续深入可自行查看帮助文档。
四、OpenSSH的服务器端sshd配置文件说明
1、OpenSSH相关常用文件:
配置文件 /etc/ssh/sshd_config
服务脚本 /etc/rc.d/init.d/sshd
脚本配置文件:/etc/sysconfig/sshd
2、/etc/ssh/sshd_config文件内常用配置说明:
ListernAddress 当前主机的监听地址 Protocol 协议版本 ,默认配置为2,不建议使用1 # HostKeys for protocol version 2 若启用协议版本2则使用下面两个相关配置 #HostKey /etc/ssh/ssh_host_rsa_key 验证主机的公钥 #HostKey /etc/ssh/ssh_host_dsa_key 验证主机的公钥 #KeyRegenerationInterval 1h 密钥的使用时间 #ServerKeyBits 1024 密钥长度 #LogLevel INFO 日志级别 #LoginGraceTime 2m 登陆宽限期 #PermitRootLogin yes root是否可以登录 ,若改为no则root用户不能登录 #StrictModes yes 严格模式,家目录 属主 属组 #MaxAuthTries 6 最多可以承受链接出错的次数 #MaxSessions 10 最大的连接数 PasswordAuthentication yes 是否使用用户名和密码的方式 Kerberos options 集中认证管理 选项该文本下面是配置的相关信息 X11Forwarding yes 是否转发图形窗口 一般最好可以在配置文件下面添加以下关于用户登录的限制信息: AllowUsers user1 user2 用户白名单 Allowgroups 组白名单 DenyUser 用户黑名单
3、关于ssh的最佳实践
1)only use ssh protocol 2 #仅使用协议2
2)limit users SSh access #限定访问ssh服务的用户
Allowusers root vivek jerry
白名单
denyUser saroj anjali foo
黑名单
3)configure Idle Log out timeout Interval #配置空闲超时长。
ClientAliveCountMax 300
ClientAliveInterval 0
4)Firwall SSH Port # 22 #使用iptables设置ssh服务安全访问策略
5)change ssh port and Limit IP binding #勿使用默认22端口
port 300
Listaddress 192.168.1.5
ListenAddress 202.54.1.5
6)use Strong SSH passwords and passphrase #使用足够长足够复杂的密码,且定期更换。
下面是生成密码的小脚本:
genpasswd(){
local 1=$1
[ "$1" == "" ]&& 1=20
tr -dc A-Za-z0-9_</dev/urandom | head -c ${1} | xargs
}
7)use Public key Based AUthentication #使用公钥认证。
8)disable Empty password #禁止空密码登录
9)thwart ssh crakers (Brute Force attack) #使用前提前用黑客工具测试能否破解
google:ssh best practice
10)rate-limit incoming port # 22 COnnections #限制ssh访问频度
11)use log analyzer #记录好日志,经常做日志分析。