SSH(Secure Shell)是标准的网络协议,主要用于实现字符界面的远程登录管理,以及远程文件复制的功能。SSH协议对通过网络协议传输的数据进行了加密,其中也包括了用户登录时输入的用户口令。与早期的telnet(远程登录)、rsh(Remote Shell,远程执行命令)、rcp(Remote File Copy,远程文件复制)等应用相比,SSH协议提供了更好的安全性。
OpenSSH是实现SSH协议的开源软件项目,适用于各类的Unix或Linux系统平台。关于OpenSSH项目的更多内容可以访问其官方网站http://www.openssh.com。
下面将讲解OpenSSH远程登录服务的基本配置与管理。
1、OpenSSH服务端安全控制 在RHEL5系统中,OpenSSH服务器和客户端的相关软件包是默认安装的,并已将sshd添加为标准的系统服务。执行“service sshd start”命令即可安缺省配置启动sshd服务,包括root在内的大部分用户(只要有能执行命令的有效Shell)都可以远程登录系统。
1.1、用户的远程登录控制
sshd服务的配置文件默认位于/etc/ssh/sshd_config,适当调整文件中的配置项,可以进一步增强sshd远程登录服务的安全性。修改配置文件后,应该执行"service sshd reload"使新的配置生效。
关于/etc/ssh/sshd_config配置文件的帮助信息可以使用"man sshd_config"命令进行查看,以下是调整sshd_config配置文件内容的几个实例。
eg:修改监听的端口号(默认为22),并限制只在一个ip地址上提供服务。


eg:禁止root用户和密码为空的用户远程登录系统


当root用户被禁止登录时,可以先使用普通用户帐号进入系统,在需要执行管理任务时再使用“su -”的方式切换为root,或者在服务器中配置sudo以执行部分管理命令。
eg:限制用户管理验证过程的时间(默认为2分钟)及最大重试次数,若超过限制后仍未能登录则将断开连接。


eg:拒绝用户zhangsan、lisi远程登录系统,其他均允许。
vim /etc/ssh/sshd_config
DenyUsers zhangsan lisi
eg:允许用户leo远程登录系统、系统用户admin从主机192.168.1.105远程登录系统,其他用户均拒绝(不要同时使用AllowUsers和DenyUsers配置)。
AllowUsers leo admin@192.168.1.105
2、身份验证方式
OpenSSH服务默认采用以下两种方式对远程登录的用户进行身份验证。
>>:密码验证。只需使用服务器中系统用户的账户名称和密码即可通过验证,这种方式使用最简便易用。但是,从用户角度来说不能保证正在连接的服务器就是他想连接的服务器(可能被假冒),从服务器角度来说暴力破解密码的防护能离开较弱。
>>:密钥对验证。需要提供相配对的密钥才能通过验证。通常由客户端的用户为自己创建一对密钥文件(即公钥和私钥),然后将公钥文件放在需要 访问的SSH服务器上。当远程登录服务器时,系统讲结合公私钥文件进行加密/解密关联验证,增强了用户登录及数据传递过程的安全性。用户还可以在客户端为 自己的私钥文件设置密码进行保护。
如果对某一个用户两种验证方式都可用,服务器将优先使用密钥对验证。对于安全性要求较高的服务器,可以禁用普通的密码验证,只对特定管理员用户使用密钥对验证。
eg:修改sshd_config配置文件,禁用密码验证,启用密钥对验证(缺省为启用)。


AuthorizedKeysFile      .ssh/authorized_keys     //指定保存各用户公钥内容的数据文件位置
service sshd restart
使用密钥对验证方式的SSH远程登录,还需要客户端的用户创建密钥文件对,并将公钥文件的内容提供给服务器。具体下面讲解。
2、SSH客户端应用
 一般来说,只要支持SSH协议的客户端软件都可以与Openssh服务器进行通讯。在Linux系统平台中,通常直接使用ssh命令程序作为 远程登录工具,还可以使用scp、sftp命令程序远程传输文件。在RHEL5系统中,scp、ssh、sftp命令工具均由openssh- client-4.3p2-16.el5软件包提供。而在Windows系统平台中,通常使用图形化的SSH客户端软件。
1、命令行客户端工具
1>:ssh远程登录
使用ssh命令远程登录服务器时,最典型的命令格式如下:
ssh username@sshserver
其中,sshserver表示需要登录到的SSH服务器的地址,可以是主机名或IP地址;而username表示用于登录的用户帐号,该帐号应该是SSH 服务器中的系统用户帐号。用户名与服务器地址之间使用“@”符号进行分割(虽然类似于电子邮件地址,但是两者并没有直接联系)。
当用户第一次登录SSH服务器时,必须接受服务器发来的RSA密钥(根据提示输入yes)后才能继续验证。接收的密钥信息将保存到~/.ssh/known_hosts文件中。
eg:使用用户帐号leo远程登录到服务器192.168.1.103连接标准的SSH客户端(22)


当省略username时,默认将以使用当前终端的用户名(不一定是root)作为验证帐号,例如:若当前用户为bear,而目标服务器中没有bear用户,则省略用户名时将无法成功登录。
eg:使用当前终端的用户为root,则使用一下两种形式都可以登录服务器192.168.1.105
ssh 192.168.1.105  或者  ssh root@192.168.1.105
如果SSH服务器使用了非默认的端口,例如2345,则客户端在登录时必须明确指定。ssh命令通过“-p”选项指定需要连接的端口号。
eg:使用用户帐号leo远程登录到运行在192.168.1.103:2345的SSH服务。
ssh -p 2345 leo@192.168.1.103
2>:scp远程复制文件
使用scp命令可以通过安全的连接与远程的SSH服务器相互拷贝文件,在复制文件时,用户必须对源文件/目录有读取权限、对目标目录有写入权限才能成功。
eg:将SSH服务器中的/etc/passwd文件复制到客户端的当前工作目录下。


eg:将客户端的/boot/grup 目录复制到 SSH 服务器中的/home/leo/目录下 (增加 -r 选项)。


3>:sftp安全FTP
使用sftp命令连接到SSH服务器,采用了与FTP类似的登录过程和交互式环境,方便在下载或上传文件前浏览目录资源。通过sftp传输数据的过程同样也是加密的。
eg:使用sftp远程登录到服务器192.168.1.103。并上传一个文件到用户宿主目录下。


2、图形页面客户端工具,有很多了,这里就不说了。什么putty、crt、Xshell
3、构建密钥对验证的SSH登录体系
在前面简单介绍过SSH服务器的密钥对验证方式,使用密钥对验证可以进一步提高远程管理服务器的安全性。下面将主要介绍实现SSH密钥对验证的基本过程。
主要步骤:
1、在客户端创建密钥对
在客户端使用ssh-keygen命令工具为当前用户创建密钥对文件,可以使用的加密算法为RSA或DSA(ssh-keygen命令的-t选项用于指定算法类型)。
eg:以zhangsan登录到客户端主机,并建立基于RSA算法的SSH密钥对


在passphrase处可以设置密码用于保护密钥对
ssh-keygen 命令执行完毕后会将密钥文件保存到用户指定的位置,默认位于用户宿主目录下的.ssh/目录下。其中id_rsa.pub是用户的公钥文件,可以提供到 SSH服务器;id_rsa是用户的私钥文件,权限默认为600,私钥文件必须妥善保管,不能泄露给他人。用户可以在创建密钥对的过程中设置一个私钥密码 短语(passphrase),以更好的控制私钥文件的使用权限。
2、上传公钥文件给服务器
将客户端用户创建的公钥文件发送给Openssh服务器,并保存到服务器的授权密钥库中。服务器的授权密钥库文件位于各用户宿主目录下的.ssh/目录,默认的文件名是authorized_keys。(你可以配置文件随意指定喔!)
传递公钥文件时可以选择FTP、Samba、HTTP、SCP甚至发送Email等任何方式(过程略!)
eg:在SSH服务器端,将客户端公钥文件的内容添加至zhangsan用户的授权密钥库。(需要创建相应zhangsan的帐号喔!!)
mkdir -p ~zhangsan/.ssh

由于sshd默认采用严格的权限检测模式(StrictModes yes),因此需要注意授权密钥库文件authorized_keys的权限设置:所有者要求是登录的目标用户或root,同组或其他用户对该文件不能写入权限。否则可能无法使用密钥验证成功登录系统。通常可以有root建立该文件,权限保持为644即可。
3、调整服务器设置
在Openssh服务器中,启用密钥对验证方式,并可以禁用密码验证方式(视具体需求而定)。修改完配置文件后重启sshd服务。
eg:修改sshd_config文件,禁用密码验证,启用密钥对验证,并重启sshd服务。

service sshd restart
4、使用密钥对验证方式登录服务器
以创建密钥对的用户帐号(如zhangsan)登录客户端本机,执行ssh命令,以服务器中授权用户(zhangsan)的身份远程登录系统。如果密钥对 验证方式配置成功,服务器将会使用密钥文件进行验证,并要求用户输入私钥文件的密码短语(如果密码短语为空,则直接登入远程服务器)。
使用密钥对验证的方式登录时,不需要知道服务器中的对应用户的密码。