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”参数允许递归地拷贝目录。

相关内容