SSHHowto

来自Ubuntu中文
跳到导航跳到搜索

原文出处:https://wiki.ubuntu.com/SSHHowTo

原文作者:UbuntuWiki

授权许可:创作共用协议 GNU FDL

翻译人员:denven

校对人员:Bentusi

贡献者:

适用版本:

文章状态:等待翻译


SSH(安全Shell)简介

OpenSSH 能提供安全的远程访问,支持命令行会话,X11转发(X forwarding),SCP 和安全 FTP 文件传输。同时,也可利用端口转发(port forwarding)为其它协议建立加密通道。

SSH 可以取代传统的telnet,rlogin,FTP。因为这些协议中密码以明文的方式传递,这意味着密码很容易被截取,而 SSH 通过加密措施解决了这些问题,提供安全的远程访问方案。它支持命令行会话,X11转发(X forwarding),SCP 和安全 FTP 文件传输。同时,也可利用端口转发(port forwarding)为其它协议建立加密通道。

安装SSH服务器端

如果希望安全地连接到远程主机(在Windows下用Putty来登录),需要为其安装一个ssh服务端。Ubuntu 采用 openssh-server 做服务端,需要的安装包是 openssh-server。

通过SSH进行远程文件传输

Linux下图形界面操作

用Nautilus即可 SSH 登录远程主机进行浏览和传输文件。 依次点击 “位置(Places)” -> “连接到服务器(Connect to Server)”,“服务类型(Service Type)”选择 “SSH”,在“服务器(Server)”栏中填写好远程主机的名称和IP地址,“用户名(User Name)”处填写登录名,你也可以为自己的登录帐户设置一个昵称。

登录后,可以在不同端的窗口间通过拖放操作来复制文件。

Windows下图形界面操作

用WinSCP在Windows下登录Linux的SSH服务器进行文件传输,该软件可以在[1]免费下载。

使用命令行操作

使用 scp 命令在本地和远程主机间安全复制文件,如下:

scp <file> <username>@<IP address or hostname>:<DestinationDirectory>

例如,要从本地主机复制一个文件到远程主机,运行:

scp file.txt [email protected]:/home/joe

又如:

scp "New Document.odw" joe@laptop:"/home/joe/Summer 2005"

使用该命令,必须包含本地文件名、远程主机名、远程主机 IP 地址(或域名)、要复制到的远程目录三个部分。

从远程主机复制文件到本地主机,运行:

scp [email protected]:/home/hornbeck/otherfile.txt .

'.'表示将文件复制到当前目录,也可以用其他的文件名,如'my.txt'将复制过来的文件重命名。

scp 命令两个最常用的参数是 '-r' 和 '-C',其中 '-r' 表示递归复制整个目录树, '-C'表示压缩,可在加快文件传送速度,此选项在 ssh 和 sftp 命令中同样有效。

注意:不能在两台远程主机间复制文件,要么从本地复制文件,要么将文件复制到本地。

在 scp 命令中,如果本地和远程主机为同一台主机,那么只需主机名(@xxx可省略)即可,如果远程主机目录被省略,那么表示在用户主目录下进行操作。例如:

scp 192.168.1.103:file.txt .

通过ssh登录远程主机

用 ssh 命令远程登录:

ssh <username>@<computer name or ipaddress>

又如:

ssh joe@laptop

如:

ssh [email protected]

Anchor(public-key-auth)

公钥验证

以前大家都使用传统的“用户名/密码”的验证方式。采用这种方式,一旦别人猜测或者嗅探到你的密码,安全性就无法保障。一直以来 SSH 提供公共密钥验证方式,即使用私钥和公钥密钥对来代替简单的密码。

如果没有私钥,请先创建一个,输入:

ssh-keygen -t dsa

然后,系统将依次询问将私钥保存到何处(保存到默认位置即可)、选择密码短语(密码短语是用来加密私钥的)。任何人只要获取到(没被保护的)私钥,他就具有访问其他机器的权限,因此建议设置密码时仔细考虑、选择一个好的密码。如果你不甚了解如何选择密码,可以参考ChoosingSecurePassword(如何选择一个安全的密码)。

到此为止,要想访问其他的机器只依赖于你的公钥。公钥在私钥创建时同时被创建,通常它位于目录:

~/.ssh/id_dsa.pub

在目标主机的密钥验证文件中需要用到这个密钥(一行ASCII的字符串),这个文件位于目标主机该目录:

~/.ssh/authorized_keys

所以需要将这行字符串拷贝到密钥验证文件中,或者使用命令"ssh-copy-id"进行处理:

ssh-copy-id root@fileserver01

使用该命令需要输入root密码,如果你不知道root密码,那么尝试用其他中间途径拷贝该密钥到目的主机。在公钥添加之后,那么就可以被验证通过了。 attachment:IconsPage/IconNote.png 在使用ssh-copy-id命令之前,需要用ssh-add(下文中有描述)命令将密码短语保存到 ssh-agent。保存后用 ssh 命令登录远程目的主机: Run::运行:

ssh root@fileserver01

这时将不会再要求输入密码,但是会要求输入密码短语。请注意,“密码”与“密码短语”是两个不同的概念。用户密码保存在目标机器的 /etc/passwd 文件中,而“密码短语”则是用来解密本机的私钥的。


在这重申一下,公钥验证的实际安全性要高于密码验证机制是因为需要两步验证:

        •  已加密的私钥
        •  用来解密私钥的密码短语

所以如果你选择无密码(在下一节中提到)的方式,比起单独使用一个密码的方式,更无安全性可言。

attachment:IconsPage/IconNote.png 在Ubuntu中已经启用基于密码的验证方式,如果你想禁用远程用户使用密码进行登录,可以手动设置:在 /etc/ssh/sshd_config 文件中设置"Password``Authentication no",然后重启 ssh 服务(sudo /etc/init.d/ssh restart)。

限制SSH登录

使用 SSH 公钥验证还有另一个方便之处,那就是目标服务器可以限制访问者所使用的命令。例如你仅需通过SSH来维护一个 CVS 仓库,可以在密钥验证文件中加入下述行: command="/usr/bin/cvs server" ssh-dss AAAAB3N....

这样只允许用户运行该命令。

通过批处理脚本自动匹配登录

在公钥验证(见上文)中也可以对需要输入密码的任务进行自动匹配。如果你想每天午夜时刻从远程主机拷贝一个文件,那么需要在两台机器之间建立一种信任关系。来看如何实现,首先在一台机器上为该服务创建一账号,再(用 ssh-keygen -t dsa命令)创建密钥对,此时如果询问是否建立密码短语,按回车键不创建(这样私钥将不会受到保护),然后(用ssh-copy-id命令)将公钥添加到另一台机器的authorized_keys2文件,这样用 ssh 登录到另一台机器将不会要求输入密码短语,最后在crontab中添加SSH调用即可。

attachment:IconsPage/IconWarning3.png 注意!对私钥不加保护可能会留下安全隐患,黑客们只需获取私钥然后就可以访问目标机器了。

Anchor(ssh-agent)

使用ssh-agent

如果需要经常通过SSH登录其他机器进行文件复制(这对管理员来说很平常),有没有简化掉密码短语输入这一步的途径呢?当然有!用SSH agent!ssh agent的"ssh-add"可以让你一劳永逸,因为启用后SSH agent会调用一个专门的子进程来记住密码短语的输入。

其原理是什么呢?这个不是我们需要关心的,你只要知道 X 会话在ssh-agent中会自动建立。在登录输入密码时启用"ssh-add"即可,下次使用 *SSH*时将不会有要求输入密码短语这一步,是不是很方便呢?:)

attachment:IconsPage/IconNote.png 重要:如果需要暂时离开自己的机器,建议最好锁住荧屏,以防离开期间他人用你的机器登录到远程主机(因为他们也不需要输入密码短语来验证)。

如果启用了"ssh-add",仍希望以后登录时要求提示有密码短语输入,需要进行如下设置:

  • Click on *System* 点击*System(系统)*
  • Choose *Preferences* 选择*Preferences(选项)*
  • Choose *Sessions* 选择*Sessions(会话)*
  • Select the *Startup Programs* tab 选择*Startup Programs(启动程序)*选项卡
  • Click on *Add* 点击*Add(添加)*
  • Enter "ssh-add" as a command 输入命令"ssh-add"


这样,下次登录时就会有要求用户输入密码短语这一步了。

安全性

用户日志和其他一些信息保存在 /var/log/auth.log (或auth.log.0等)文件中,通过检查日志文件来查看是否有其他用户尝试登录自己的系统,运行命令:

awk '/Invalid user/ {print $8}' /var/log/auth.log{,.0} | sort | uniq -c

该命令通过排列用户登陆次数来显示某些使用非法用户名尝试登录(或许是自动登录攻击)的痕迹。

用 last 命令查看日志中用户及其最后登录信息 ,用 lastb 命令可以快速查看。

配置更具安全性的SSH服务器,参考下文Advanced Configuration(高级配置)。

高级配置

高级配置和其他安全性方面请参考AdvancedOpenSSH

关于GPG和OpenSSH

如何使用 GPG 部署 SSH 密钥请参考GPGsigningforSSHHowTo