感谢支持
我们一直在努力

Linux下的ssh和scp介绍

SSH的简单介绍


传统的网络服务程序,如:ftp、pop和telnet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人非常容易就可以截获这些口令和数据。而且,这些服务程序的安全验证方式也是有其弱点的,就是很容易受到“中间人”(man-in-the-middle)这种方式的攻击。所谓 “中间人”的攻击方式,就是“中间人”冒充真正的服务器接收你的传给服务器的数据,然后再冒充你把数据传给真正的服务器。服务器和你之间的数据传送被“中间人”一转手做了手脚之后,就会出现很严重的问题。


SSH的英文全称是Secure SHell。通过使用SSH,你可以把所有传输的数据进行加密,这样“中间人”这种攻击方式就不可能实现了,而且也能够防止DNS和IP欺骗。还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替telnet,又可以为ftp、pop、甚至ppp提供一个安全的“通道”。


最初SSH是由芬兰的一家公司开发的。但是因为受版权和加密算法的限制,现在很多人都转而使用OpenSSH。OpenSSH是SSH的替代软件,而且是免费的,可以预计将来会有越来越多的人使用它而不是SSH。


SSH是由客户端和服务端的软件组成的,有两个不兼容的版本分别是:1.x和2.x。用SSH 2.x的客户程序是不能连接到SSH 1.x的服务程序上去的。OpenSSH 2.x同时支持SSH 1.x和2.x。


SSH的安全验证机制


从客户端来看,SSH提供两种级别的安全验证。


第一种级别(基于口令的安全验证)只要你知道远程服务器的用户的帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器,可能会有别的服务器在冒充真正的服务器,也就是受到“中间人”这种方式的攻击。


第二种级别(基于密匙的安全验证)需要依靠密匙,也就是你必须在本地为自己创建一对密匙,并把公用密匙放在需要访问的远程服务器上。如果你要从本地连接到远程的SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密匙进行安全验证。服务器收到请求之后,先在你在该服务器上面的用户的家目录下寻找你的公用密匙,然后把它和你发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用公用密匙加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私人密匙解密再把它发送给服务器。用这种方式,你必须知道自己密匙的口令。但是,与第一种级别相比,第二种级别不需要在网络上传送口令。


第二种级别不仅加密所有传送的数据,而且“中间人”这种攻击方式也是不可能的(因为他没有你的私人密匙)。但是整个登录的过程可能需要10秒。


 


SSH的安装


现在比较流行的实现SSH的软件有OpenSSH,但是因为受到美国法律的限制,在很多Linux的发行版中都没有包括OpenSSH,但是可以从网络上下载并安装OpenSSH。


安装完SSH之后,很多软件(如OpenSSH)都已经自动帮你配置好相关文件了,但是这不是绝对的,因此,你必须要学会自己配置SSH的配置文件。


安装完成以后会在“/etc/ssh/”这个目录下,包含两个文件“sshd_config”和“ssh_config”;在“/etc/pam.d/”目录下,包含文件“ssh”。这三个文件,通过后面的配置介绍就会知道,是运行ssh的必须配置文件。


一台机器,它既可以做SSH的服务器端,让别的client通过ssh连接进来;当然,它自身也可以作为SSH的client端,连接到远程的服务器去。因此,一般安装好SSH的相关软件(如OpenSSH),都要对这两种情况进行配置。下面就分别讲述,(主要以OpenSSH作为实例软件),当它作为服务器的时候需要配置哪些文件,而作为客户端的时候又需要怎么配置。


 


作为客户端时SSH需要配置的文件


OpenSSH有三种配置方式:命令行参数、用户配置文件和系统级的配置文件(“/etc/ssh/ssh_config”)。命令行参数优先于用户配置文件,用户配置文件优先于系统配置文件,所有的命令行的参数都能在配置文件中设置。


由于在安装的时候没有默认的用户配置文件,所以要把“/etc/ssh/ssh_config”文件copy并重新命名为“~/.ssh/config”。


客户端配置文件,就是/etc/ssh/ssh_config,也就是~/.ssh/config,是OpenSSH系统范围的配置文件,允许你通过设置不同的选项来改变客户端程序的运行方式。这个文件的每一行包含“关键词–值”的匹配,其中“关键词”是忽略大小写的。下面列出来的是最重要的关键词,并且作了相关的作用注释,你可以使用man命令来查看帮助页(ssh (1)),这样就可以得到详细的列表。


# Site-wide defaults for various options


Host *                        — 表示在该文件的下一个host之前的所有配置条目,都只对匹配后面字符串的主机有效,“*”表示所有计算机


ForwardAgent no               — 设置连接是否经过验证代理转发给远程计算机(如果有的话)


ForwardX11 no                 — 设置X11连接是否被自动重定向到安全的通道和显示集(DISPLAY set),为了在本地运行远程的X程序必须设置这个值


RhostsAuthentication no       — 设置是否使用基于rhosts的安全验证


RhostsRSAAuthentication no    — 设置是否使用利用RSA算法的基于rhosts的安全验证


RSAAuthentication yes         — 设置是否使用RSA算法进行安全验证


PasswordAuthentication yes    — 设置是否使用口令验证


FallBackToRsh no              — 设置如果用ssh连接出现错误是否自动使用rsh


UseRsh no                     — 设置是否在这台计算机上使用“rlogin/rsh”


BatchMode no                  — 如果设为“yes”,passphrase/password(交互式输入口令)的提示将被禁止。因此,当不能交互式输入口令的时候,如对脚本文件和批处理任务,它就十分有用。


CheckHostIP yes               — 设置ssh是否查看连接到服务器的主机的IP地址以防止DNS欺骗,建议设置为“yes”


StrictHostKeyChecking no      — 如果设置为“yes”,ssh就不会自动把计算机的密钥加入“$HOME/.ssh/known_hosts”文件,并且一旦计算机的密钥发生了变化,就拒绝连接


IdentityFile ~/.ssh/identity  — 设置从哪个文件读取用户的RSA安全验证标识


Port 22                       — 设置连接到远程主机的端口


Cipher blowfish               — 设置加密用的密码


EscapeChar ~                  — 设置escape字符


CompressionLevel 6            — 传输的数据使用数据压缩,压缩的级别是【1,9】


LogLevel DEBUG INFO           — 表示当SSH出现问题的时候,怎么办?默认为“INFO”


 


作为服务器时SSH需要配置的文件


SSH服务器的配置使用的是“/etc/ssh/sshd_config”配置文件,这些选项的设置在配置文件中已经有了一些说明而且用“man sshd”也可以查看帮助。请注意OpenSSH对于SSH 1.x和2.x没有不同的配置文件。


下面列出来的是最重要的关键词,并且作了相关的作用注释。


# This is ssh server systemwide configuration file.


Port 22                        — 设置服务器sshd监听的端口号


ListenAddress 192.168.1.1      — 设置sshd服务器绑定的ip地址


HostKey /etc/ssh/ssh_host_key  — 设置包含计算机私人密钥的文件


ServerKeyBits 1024             — 定义服务器密钥的位数


LoginGraceTime 600             — 设置如果用户不能成功登陆,在切断连接之前,服务器需要等待的时间,以秒为单位


KeyRegenerationInterval 3600   — 设置在多少秒之后自动生成服务器的密钥(如果使用密钥),重新生成密钥是为了防止被盗用的密钥被用来解密被截获的信息


PermitRootLogin no             — 设置root用户能不能使用ssh登录;最好把这个选项设置成“PermitRootLogin without-password”,这样“root”用户就不能从没有密匙的计算机上登录;


把这个选项设置成“no”将禁止“root”用户登录,只能用“su”命令从普通用户转成“root”;设为yes就表示允许root通过ssh登录,不安全,极不建议


IgnoreRhosts yes               — 设置验证的时候是否使用“rhosts”和“shosts”文件


IgnoreUserKnownHosts yes       — 设置ssh daemon在进行RhostsRSAAuthentication安全验证的时候是否忽略用户的“$HOME/.ssh/known_hosts”


StrictModes yes                — 设置ssh在接收登录请求之前,是否检查用户家目录和rhosts文件的权限和所有权。


X11Forwarding no               — 设置是否允许X11转发。设为“yes”允许用户运行远程主机上的X程序。


PrintMotd yes                  — 设置sshd是否在用户登录的时候显示“/etc/motd”中的信息


SyslogFacility AUTH            — 设���在记录来自sshd的消息的时候,是否给出“facility code”


LogLevel INFO                  — 设置记录sshd日志消息的层次。INFO是一个好的选择。


RhostsAuthentication no        — 设置是否只用rhosts或“/etc/hosts.equiv”进行安全验证


RhostsRSAAuthentication no     — 设置是否允许用rhosts或“/etc/hosts.euive”加上RSA进行安全验证


RSAAuthentication yes          — 设置是否允许只有RSA进行验证


PasswordAuthentication yes     — 设置是否允许口令验证。设为no只允许用户用基于密钥的方式登录,而不能使用基于口令的方式登录。


PermitEmptyPasswords no        — 设置是否允许用口令为空的帐号登陆


AllowUsers admin              — AllowUsers的后面跟着任意的数量的用户名的匹配串(patterns)或user@host这样的匹配串,这些字符串之间用空格隔开,主机名可以是DNS名或ip地址。


#Subsystem /usr/local/sbin/sftpd  — 把前面的#号去掉并且把路径名设置成/usr/bin/sftpserv,则用户将能使用sftp(安全带ftp)了。


PubkeyAuthentication yes       — 允许使用公钥进行验证


 


生成密钥对


正如前面所介绍的,如果要实现ssh的通信,那么服务器端必须要有客户端的公钥,而客户端自己保留私钥,这样才能实现验证,因为它们是基于公钥算法进行加密的。因此,就必须要在客户端生成密钥对,然后自己保留私钥,把公钥分发到自己想访问的服务器端去。下面就来介绍客户端这个生成密钥对的过程。


用下面的命令可以生成密匙:ssh-keygen;如果远程主机使用的是SSH 2.x就要用这个命令:ssh-keygen  –d。在同一台主机上同时有SSH1和SSH2的密匙是没有问题的,因为密匙是存成不同的文件的。


ssh-keygen/ssh-keygen  -d命令运行之后会显示下面的信息:


Generating public/private dsa key pair.


Enter file in which to save the key (/home/mms/.ssh/id_dsa):


#按回车保存为: /home/mms/.ssh/id_dsa,即当前用户mms的私钥


Enter passphrase (empty for no passphrase):


# 按回车,表示读取密钥时不需要密钥的密码


Enter same passphrase again:


# 确认密钥的密码,必须和上面的输入相同


Your identification has been saved in /home/mms/.ssh/id_dsa.


# 私钥保存信息


Your public key has been saved in /home/mms/.ssh/id_dsa.pub.


# 公钥保存信息


The key fingerprint is:


ec:41:e8:08:38:0b:f8:1e:bc:92:98:32:fc:d7:69:7d mms@mms1.lxhd.com


# 密钥指纹


现在你有一对密匙了,公用密匙要分发到所有你想用ssh登录的远程主机上去;私人密匙要好好地保管防止别人知道你的私人密匙。用“ls –l ~/.ssh/identity”或“ls –l ~/.ssh/id_dsa”所显示的文件的访问权限必须是“-rw——-”。如果你怀疑自己的密匙已经被别人知道了,不要迟疑马上生成一对新的密匙。当然,你还要重新分发一次公用密匙。


分发公钥


具体步骤如下所示:


1. copy公钥到所要登录的远程服务器的指定用户的家目录(你在要访问的服务器是所使用的登录用户的家目录)下,例如:


scp  id_dsa.pub  oracle@csdba:/home/oracle/.ssh/pub.ilonng


这里Oracle为sftp使用的登录用户,若目录/home/[user]/.ssh/不存在,请先创建之。


2. 将copy来的公钥文件改名为authorized_keys,如果已经存在authorized_keys,可以使用命令: cat  id_dsa.pub >> authorized_keys 将其内容附加到authorized_keys的末尾


3. 修改公钥文件的访问权限


chmod 644 authorized_keys


4. 重启SSH服务


SSH连接的建立


安装完OpenSSH之后,用下面命令测试一下连接的建立:


ssh -l [your accountname on the remote host] [address of the remote host]


如果OpenSSH工作正常,你会看到下面的提示信息:


The authenticity of host [hostname] can’t be established.


Key fingerprint is 1024 5f:a0:0b:65:d3:82:df:ab:44:62:6d:98:9c:fe:e9:52.


Are you sure you want to continue connecting (yes/no)?


OpenSSH告诉你它不知道这台主机,但是你不用担心这个问题,因为你是第一次登录这台主机。键入“yes”,这将把这台远程主机的“识别标记”加到“~/.ssh/know_hosts”文件中,以便识别之用。当你第二次访问这台远程主机的时候,你的机器就能通过这些“识别标记”来识别远程的那台机器,耶就不会再显示这条提示信息了。然后,SSH提示你输入远程主机上你的帐号的口令。输入完口令之后,就建立了SSH连接,这之后就可以象使用telnet那样使用SSH了。


跨机拷贝SCP


SCP的全称是secure copy (remote file copy program),此命令是openssh-clients附带的,它的作用就是在机器之间实现拷贝,且机器之间的传输完全是加密的,此命令格式为:scp localfile user@server:path。


SCP假定你在远程主机上的家目录为你的工作目录,如果你使用相对目录就要相对于家目录,因此上面命令格式中path最好使用绝对路径;用“scp”命令的“-r”参数允许递归地拷贝目录。

赞(0) 打赏
转载请注明出处:服务器评测 » Linux下的ssh和scp介绍
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏