跳过导航链接 | |
退出打印视图 | |
![]() |
Oracle Solaris 11.1 管理:安全服务 Oracle Solaris 11.1 Information Library (简体中文) |
安全 Shell 可提供本地 shell 与远程 shell 之间的安全访问。有关更多信息,请参见 ssh_config(4) 和 ssh(1) 手册页。
以下任务列表列出了有关使用安全 Shell 的用户过程。
|
如果用户的站点要实现基于主机的验证或用户公钥验证,则必须生成公钥/私钥对。有关其他选项,请参见 ssh-keygen(1) 手册页。
开始之前
通过系统管理员确认是否配置了基于主机的验证。
myLocalHost% ssh-keygen -t rsa Generating public/private rsa key pair. …
其中,-t 是算法类型,可以是 rsa、dsa 或 rsa1 之一。
缺省情况下,文件名 id_rsa(表示 RSA v2 密钥)显示在括号中。可通过按回车键选择此文件。或者,可以键入替换的文件名。
Enter file in which to save the key (/home/jdoe/.ssh/id_rsa):<Press Return>
通过将字符串 .pub 附加到私钥文件的名称后,可以自动创建公钥的文件名。
此口令短语用于加密私钥。强烈建议不要使用空项。请注意,键入口令短语时,它们不会显示。
Enter passphrase (empty for no passphrase): <Type passphrase>
Enter same passphrase again: <Type passphrase> Your identification has been saved in /home/jdoe/.ssh/id_rsa. Your public key has been saved in /home/jdoe/.ssh/id_rsa.pub. The key fingerprint is: 0e:fb:3d:57:71:73:bf:58:b8:eb:f3:a3:aa:df:e0:d1 jdoe@myLocalHost
检查密钥文件的路径是否正确。
% ls ~/.ssh id_rsa id_rsa.pub
此时,已创建公钥/私钥对。
现在即可登录到远程主机。有关详细信息,请参见如何使用安全 Shell 登录到远程主机。
% cat /etc/ssh/ssh_host_dsa_key.pub | ssh RemoteHost \ 'cat >> ~./ssh/known_hosts && echo "Host key copied"'
Enter password: <Type password> Host key copied %
在一行中键入以下命令(不带反斜杠)。
myLocalHost% cat $HOME/.ssh/id_rsa.pub | ssh myRemoteHost \ 'cat >> .ssh/authorized_keys && echo "Key copied"'
复制该文件后,将显示 "Key copied"(密钥已复制)消息。
Enter password: Type login password Key copied myLocalHost%
有关过程,请参见如何减少安全 Shell 中的口令提示。有关更多信息,请参见 ssh-agent(1) 和 ssh-add(1)手册页。
以下过程不会更改私钥。此过程将更改私钥的验证机制,即口令短语。有关更多信息,请参见 ssh-keygen(1) 手册页。
键入带 -p 选项的 ssh-keygen 命令,并回答提示。
myLocalHost% ssh-keygen -p Enter file which contains the private key (/home/jdoe/.ssh/id_rsa):<Press Return> Enter passphrase (empty for no passphrase): <Type passphrase> Enter same passphrase again: <Type passphrase>
其中,-p 用于请求更改私钥文件的口令短语。
键入 ssh 命令,并指定远程主机名称和您的登录信息。
myLocalHost% ssh myRemoteHost -l username
此时会出现提示,询问远程主机的真实性:
The authenticity of host 'myRemoteHost' can't be established. RSA key fingerprint in md5 is: 04:9f:bd:fc:3d:3e:d2:e7:49:fd:6e:18:4f:9c:26 Are you sure you want to continue connecting(yes/no)?
初始连接到远程主机时,出现此提示为正常情况。
Are you sure you want to continue connecting(yes/no)? no
管理员负责更新全局 /etc/ssh/ssh_known_hosts 文件。更新后的 ssh_known_hosts 文件可禁止出现此提示。
Are you sure you want to continue connecting(yes/no)? yes
Enter passphrase for key '/home/jdoe/.ssh/id_rsa': <Type passphrase>
jdoe@myRemoteHost's password: <Type password> Last login: Wed Sep 7 09:07:49 2011 from myLocalHost Oracle Corporation SunOS 5.11 September 2011 myRemoteHost%
所发送的命令将会加密。所接收的任何响应都会加密。
完成后,键入 exit 或者使用常规方法退出 shell。
myRemoteHost% exit myRemoteHost% logout Connection to myRemoteHost closed myLocalHost%
示例 15-2 在 安全 Shell 中显示远程 GUI
在此示例中,jdoe 在两个系统上都是初始用户,因此指定有 Software Installation(软件安装)权限配置文件。jdoe 想要使用远程系统上的软件包管理器 GUI。X11Forwarding 关键字的缺省值仍然是 yes,并且 xauth 软件包安装在远程系统上。
% ssh -l jdoe -X myRemoteHost jdoe@myRemoteHost's password: <Type password> Last login: Wed Sep 7 09:07:49 2011 from myLocalHost Oracle Corporation SunOS 5.11 September 2011 myRemoteHost% packagemanager &
如果不想键入口令短语和口令来使用安全 Shell,则可以使用代理守护进程。请在会话开始时启动守护进程。然后,使用 ssh-add 命令将私钥存储到代理守护进程中。如果您在不同的主机上拥有不同的帐户,请添加需要用于会话的密钥。
可以根据需要手动启动代理守护进程,如以下过程所述:
myLocalHost% eval `ssh-agent` Agent pid 9892
myLocalHost% pgrep ssh-agent 9892
键入 ssh-add 命令。
myLocalHost% ssh-add Enter passphrase for /home/jdoe/.ssh/id_rsa: <Type passphrase> Identity added: /home/jdoe/.ssh/id_rsa(/home/jdoe/.ssh/id_rsa) myLocalHost%
myLocalHost% ssh myRemoteHost -l jdoe
系统不会提示您输入口令短语。
示例 15-3 使用 ssh-add 选项
在本示例中,jdoe 将向代理守护进程添加两个密钥。-l 选项用于列出该守护进程中存储的所有密钥。在会话结束时,使用 -D 选项删除代理守护进程中的所有密钥。
myLocalHost% ssh-agent myLocalHost% ssh-add Enter passphrase for /home/jdoe/.ssh/id_rsa: <Type passphrase> Identity added: /home/jdoe/.ssh/id_rsa(/home/jdoe/.ssh/id_rsa) myLocalHost% ssh-add /home/jdoe/.ssh/id_dsa Enter passphrase for /home/jdoe/.ssh/id_dsa: <Type passphrase> Identity added: /home/jdoe/.ssh/id_dsa(/home/jdoe/.ssh/id_dsa) myLocalHost% ssh-add -l md5 1024 0e:fb:3d:53:71:77:bf:57:b8:eb:f7:a7:aa:df:e0:d1 /home/jdoe/.ssh/id_rsa(RSA) md5 1024 c1:d3:21:5e:40:60:c5:73:d8:87:09:3a:fa:5f:32:53 /home/jdoe/.ssh/id_dsa(DSA) User conducts Oracle Solaris 安全 Shell transactions
myLocalHost% ssh-add -D Identity removed: /home/jdoe/.ssh/id_rsa(/home/jdoe/.ssh/id_rsa.pub) /home/jdoe/.ssh/id_dsa(DSA)
缺省情况下,root 角色无法使用 安全 Shell 进行远程登录。过去,root 曾使用 安全 Shell 执行许多重要任务,例如将 ZFS 池数据发送到远程系统上的存储。在此过程中,root 角色创建一个可担任远程 ZFS 管理员的用户。
开始之前
您必须承担 root 角色。有关更多信息,请参见如何使用指定给您的管理权限。
例如,创建 zfsroot 用户,并提供口令。
source # useradd -c "Remote ZFS Administrator" -u 1201 -d /home/zfsroot zfsroot source # passwd zfsroot Enter password: Retype password: #
dest # useradd -c "Remote ZFS Administrator" -u 1201 -d /home/zfsroot zfsroot dest # passwd zfsroot ...
必须在两个系统上以完全相同的方式定义 zfsroot 用户。
密钥对是在源系统上创建的。然后,将公钥复制到目标系统上的 zfsroot 用户。
# ssh-keygen -t rsa -P "" -f ~/id_migrate Generating public/private rsa key pair. Your identification has been saved in /root/id_migrate. Your public key has been saved in /root/id_migrate.pub. The key fingerprint is: 3c:7f:40:ef:ec:63:95:b9:23:a2:72:d5:ea:d1:61:f0 root@source
# scp ~/id_migrate.pub zfsroot@dest: The authenticity of host 'dest (10.134.76.126)' can't be established. RSA key fingerprint is 44:37:ab:4e:b7:2f:2f:b8:5f:98:9d:e9:ed:6d:46:80. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'dest,10.134.76.126' (RSA) to the list of known hosts. Password: id_migrate.pub 100% |*****************************| 399 00:00
source # usermod -P +'ZFS File System Management' -S files zfsroot dest # usermod -P +'ZFS File System Management' -S files zfsroot
dest # profiles zfsroot zfsroot: ZFS File System Management Basic Solaris User All
root@dest # su - zfsroot Oracle Corporation SunOS 5.11 11.1 May 2012 zfsroot@dest $ mkdir -m 700 .ssh zfsroot@dest $ cat id_migrate.pub >> .ssh/authorized_keys
root@source# ssh -l zfsroot -i ~/id_migrate dest \ pfexec /usr/sbin/zfs snapshot zones@test root@source# ssh -l zfsroot -i ~/id_migrate dest \ pfexec /usr/sbin/zfs destroy zones@test
root@source# zfs snapshot -r rpool/zones@migrate-all root@source# zfs send -rc rpool/zones@migrate-all | \ ssh -l zfsroot -i ~/id_migrate dest pfexec /usr/sbin/zfs recv -F zones
root@dest# usermod -P -'ZFS File System Management' zfsroot root@dest# su - zfsroot zfsroot@dest# cp .ssh/authorized_keys .ssh/authorized_keys.bak zfsroot@dest# grep -v root@source .ssh/authorized_keys.bak> .ssh/authorized_keys
可以指定将本地端口转发到远程主机。实际上,分配了一个套接字用于侦听本地端的端口。从此端口到远程主机的连接通过安全通道实现。例如,可以指定端口 143 以通过 IMAP4 远程获取电子邮件。同样,也可以在远程端指定端口。
开始之前
使用端口转发之前,管理员必须先在远程安全 Shell 服务器上启用端口转发。有关详细信息,请参见如何在安全 Shell 中配置端口转发。
指定用于侦听远程通信的本地端口。此外,指定用于转发通信的远程主机和远程端口。
myLocalHost% ssh -L localPort:remoteHost:remotePort
指定用于侦听远程通信的远程端口。此外,指定用于转发通信的本地主机和本地端口。
myLocalHost% ssh -R remotePort:localhost:localPort
示例 15-4 使用本地端口转发接收邮件
以下示例说明如何使用本地端口转发来安全地接收来自远程服务器的邮件。
myLocalHost% ssh -L 9143:myRemoteHost:143 myRemoteHost
此命令可将连接从 myLocalHost 上端口 9143 转发到端口 143。端口 143 是 myRemoteHost 上的 IMAP v2 服务器端口。用户启动邮件应用程序时,可指定 IMAP 服务器的本地端口号码,如 localhost:9143。
不要混淆 localhost 与 myLocalHost。myLocalHost 是假设的主机名,而 localhost 则是用于标识本地系统的关键字。
示例 15-5 使用远程端口转发在防火墙外部进行通信
本示例说明企业环境中的用户如何将连接从外部网络中的主机转发到公司防火墙内的主机。
myLocalHost% ssh -R 9022:myLocalHost:22 myOutsideHost
此命令将连接从 myOutsideHost 上的端口 9022 转发到本地主机上的端口 22(sshd 服务器)。
myOutsideHost% ssh -p 9022 localhost myLocalHost%
以下过程说明如何使用 scp 命令在主机之间复制加密的文件。您可以在一台本地主机和一台远程主机之间,或者两台远程主机之间复制加密的文件。scp 命令提示进行验证。有关更多信息,请参见 scp(1) 手册页。
也可以使用 sftp 安全文件传输程序。有关更多信息,请参见 sftp(1) 手册页。有关示例,请参见示例 15-6。
注 - 审计服务可审计 ft 审计类中的 sftp 交易。对于 scp,审计服务可审计 ssh 会话的接入和退出。
指定源文件、远程目标上的用户名和目标目录。
myLocalHost% scp myfile.1 jdoe@myRemoteHost:~
Enter passphrase for key '/home/jdoe/.ssh/id_rsa': <Type passphrase> myfile.1 25% |******* | 640 KB 0:20 ETA myfile.1
键入口令短语后,将会显示进度指示器。请参见上述输出中的第二行。进度指示器显示以下内容:
文件名
已传输的文件百分比
表示已传输文件百分比的一系列星号
已传输的数据量
完整文件的估计到达时间 (estimated time of arrival, ETA)(即剩余的时间量)
示例 15-6 使用 sftp 命令时指定一个端口
在本示例中,用户希望 sftp 命令使用特定端口。用户使用 -o 选项来指定端口。
% sftp -o port=2222 guest@RemoteFileServer
可以使用安全 Shell 建立从防火墙内的主机到防火墙外的主机的连接。通过在配置文件中指定 ssh 的代理命令或者在命令行中将该代理命令指定为选项,可以完成此任务。有关命令行选项,请参见示例 15-7。
通常,可以通过配置文件定制 ssh 交互。
可以在 ~/.ssh/config 中定制独立的个人文件。
或者,可以使用管理配置文件 /etc/ssh/ssh_config 中的设置。
可以使用两种类型的代理命令定制这些文件。一个是用于 HTTP 连接的代理命令。另一个是用于 SOCKS5 连接的代理命令。有关更多信息,请参见 ssh_config(4) 手册页。
使用以下语法添加所需数量的行:
[Host outside-host] ProxyCommand proxy-command [-h proxy-server] \ [-p proxy-port] outside-host|%h outside-port|%p
在命令行中指定远程主机名时,将代理命令规范限制为实例。如果对 outside-host 使用通配符,则可将代理命令规范应用于一组主机。
指定代理命令。
该命令可以是以下之一:
/usr/lib/ssh/ssh-http-proxy-connect,用于 HTTP 连接
/usr/lib/ssh/ssh-socks5-proxy-connect,用于 SOCKS5 连接
这些选项分别指定代理服务器和代理端口。如果存在,则代理将覆盖指定代理服务器和代理端口的任何环境变量,如 HTTPPROXY、HTTPPROXYPORT、SOCKS5_PORT、SOCKS5_SERVER 和 http_proxy。http_proxy 变量指定 URL。如果不使用这些选项,则必须设置相关的环境变量。有关更多信息,请参见 ssh-socks5-proxy-connect(1) 和 ssh-http-proxy-connect(1) 手册页。
指定要连接到的特定主机。请在命令行中使用 %h 替换参数来指定主机。
指定要连接的特定端口。请在命令行中使用 %p 替换参数来指定端口。通过指定 %h 和 %p 而不使用 Host outside-host 选项,只要调用 ssh 命令即可将代理命令应用到主机参数。
例如,键入以下命令:
myLocalHost% ssh myOutsideHost
该命令可在个人配置文件中查找 myOutsideHost 的代理命令规范。如果找不到规范,则该命令将在系统范围的配置文件 /etc/ssh/ssh_config 中查找。该代理命令将替代 ssh 命令。
示例 15-7 通过 安全 Shell 命令行连接到防火墙外部的主机
如何设置防火墙外部主机的缺省 安全 Shell 连接说明了如何在配置文件中指定代理命令。在本示例中,在 ssh 命令行中指定代理命令。
% ssh -o'Proxycommand=/usr/lib/ssh/ssh-http-proxy-connect \ -h myProxyServer -p 8080 myOutsideHost 22' myOutsideHost
ssh 命令的 -o 选项提供了指定代理命令的命令行方法。此示例命令可执行以下操作:
使用 HTTP 代理命令替代 ssh
使用端口 8080 并将 myProxyServer 用作代理服务器
连接到 myOutsideHost 上的端口 22