Secure Shell安全Shell入门


备注

SSH(Secure Shell)是一种加密协议,用于通过不安全网络(Internet)进行点对点通信。它废弃了过去使用的旧协议( rloginrshtelnet )。

它通常用于连接数据中心或私有云(谷歌计算引擎,AWS等)中的远程服务器,虚拟机或容器。但它也常用于与git一起使用公钥而不是密码来安全地访问和更新您的存储库。

它还应该提到ssh中的任何大型主题,并链接到相关主题。由于ssh的文档是新的,您可能需要创建这些相关主题的初始版本。去做

版本

发行说明发布日期
OpenSSH 7.3p1 最新版本 2016年8月1日
OpenSSH 7.2p2 2016年3月9日
OpenSSH 7.1p2 2016年1月14日
OpenSSH 7.1 2015年8月21日
OpenSSH 7.0 2015年11月8日
OpenSSH 6.9 2015年7月1日
OpenSSH 6.8 2015年3月18日

将公钥添加到服务器用户的授权密钥列表中

为了ssh 到服务器,您的身份的公钥必须添加到可信密钥列表中。最常见的是这是按用户完成的:

ssh-copy-id -i ~/.ssh/<identity>.pub <user>@<hostname>
 

这也可以手动完成:

cat ~/.ssh/<identity>.pub | ssh <user>@<hostname> 'cat >> ~/.ssh/authorized_keys'
 

执行此操作后,您应该能够在将身份文件传递给ssh 调用时无需提供用户密码即可ssh

配置文件

OpenSSH配置文件用于每次运行ssh客户端时应该应用的配置。大多数命令行选项都可以放入配置文件中。

OpenSSH按顺序使用以下来源的配置:

  1. 命令行选项
  2. 用户的配置文件~/.ssh/config
  3. 系统范围的配置文件/etc/ssh/ssh_config

配置选项在配置文件中逐个列出。

# This is a comment.

# Parameter can be specified like this, separated with white space.
StrictHostKeyChecking ask

# Or parameter key and value may be separated with white space and =.  
ForwardX11 = yes

# The parameter value can be quoted if it contains white space.    
IdentityFile "/file system/path with/white space"
 

此处提供了可能的配置参数的完整列表。

配置文件最有用的功能之一是可以根据主机名或地址对其进行分区。通过这种方式,您可以为不同的主机配置不同的配置。

# Based on host name.    

Host host1.domain.com
    User user1

Host host2.domain.com
    User user2

# Or wildcard matching name or ip.

Host *elastic-cloud.com 10.201.4.?
    User user3
 

使用密码从脚本连接

当你真的需要脚本ssh 连接时,将密码管道输入到ssh 命令不起作用( echo passw0rd | ssh host )。这是因为密码不是从标准输入读取的,而是直接来自TTY(电传打字机,电传打字机,电传打字机,因为历史原因)。

但是有sshpass 工具可以解决这个问题。它可以从参数,文件或环境变量中读取密码。但请注意,这些选项都不能满足密码的安全要求!

$ sshpass -p passw0rd ssh host
$ sshpass -f /secret/filename ssh host
$ SSHPASS=passw0rd sshpass -e ssh host
 

ps 的其他用户可以看到命令行选项(在运行时它被屏蔽,但在开始时没有,你不能依赖它):

... 23624  6216 pts/5    Ss   Aug30   0:00  \_ /bin/bash
... 12812  1988 pts/5    S+   08:50   0:00  |   \_ sshpass -p passw0rd ssh host
... 45008  5796 pts/15   Ss+  08:50   0:00  |       \_ ssh host
 

请注意,使用/proc/PID/environ 文件,系统上的其他进程也可以访问进程的environemnet变量。

最后,将密码存储在文件中可能看起来是最好的想法,但仍然使用其他示例中描述的密钥是使用ssh 首选方法。

创建SSH密钥

您可以使用ssh-keygen创建ssh密钥,它是ssh安装的一部分。为此,只需运行它并按照屏幕上的说明操作即可。

这是一个例子:

$ ssh-keygen
Generating public/private rsa key pair.
 

将保存ssh密钥对的默认目录位于主目录的.ssh 文件夹中(可以通过指定有效路径来更改),密钥对的默认名称为id_rsaid_rsa.pub 的默认名称。公钥:

Enter file in which to save the key (/home/nasreddine/.ssh/id_rsa): /home/my_folder/my_ssh_key
 

您可以通过输入密码来保护您的SSH密钥免遭未经授权的使用。这是可选的,但建议您使用密码。请注意,与任何其他命令程序一样,在输入密码时,它不会在屏幕上显示任何内容,但会记录下来:

Enter passphrase (empty for no passphrase):
Enter same passphrase again:
 

输入密码后,ssh-keygen将生成密钥并将其保存到您选择的路径中:

Your identification has been saved in /home/my_folder/my_ssh_key.
Your public key has been saved in /home/my_folder/my_ssh_key.pub.
 

我们完成了。现在我们的ssh密钥已经可以使用了。

在此处输入图像描述

如何SSH到机器

要使用SSH在计算机上登录用户帐户,可以使用命令ssh username@ip_address 。它会要求输入密码。如果键入正确的密码,您将连接到该计算机上该用户的shell。否则会再次提示输入密码。

例如

root@dev10:~# ssh root@10.11.50.3
root@10.11.50.3's password: 
Welcome to Ubuntu 16.04 LTS (GNU/Linux 4.4.0-31-generic x86_64)
    
Last login: Fri Jul 22 18:33:27 2016 from 10.11.50.10
root@dev2:~# 
 

如果要使用特定的ssh密钥连接到计算机,请使用ssh -i /path/to/ssh_secret_key username@host

当您第一次连接到计算机时,它会要求您验证目标计算机的指纹 。这是一种避免中间人攻击的安全机制。您可以通过在目标计算机中发出此命令来查看目标计算机的指纹。

ssh-keygen -l -E md5 -f /etc/ssh/ssh_host_ecdsa_key.pub
 

如果两者相同,则可以键入“是”。它将进入密码提示。

例:

root@dev10:~# ssh root@10.11.50.3
The authenticity of host '10.11.50.3 (10.11.50.3)' can't be established.
ECDSA key fingerprint is dd:a3:de:cd:5b:01:cd:0b:b6:bc:b3:09:c2:c8:1a:68.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.11.50.3' (ECDSA) to the list of known hosts.
root@10.11.50.3's password: 

Last login: Fri Jul 22 17:45:09 2016 from 10.11.1.71
root@dev2:~# 
 

安装或设置

免费版本的SSH协议实现,OpenSSH可在所有Linux发行版中使用。它由服务器和客户端包组成。

安装

在基于Debian的Linux上,您可以使用openssh 进行安装

# apt-get install openssh-server openssh-client
 

在RHEL / CentOS上你需要使用yum

# yum install openssh-server openssh-clients
 

目前Fedora使用的是dnf 而不是yum

在Arch Linux上,使用pacman:

# pacman -S openssh
 

在OSX上,应该已经安装了openssh

如果您想使用更新的版本,则需要安装brew中的openssh

# brew install openssh --with-brewed-openssl --with-keychain-support
 

适用于Windows的TODO说明

建立

openssh 客户端不需要任何特殊设置,可以在安装后立即使用。你可以尝试运行ssh remote ,其中remote 正在运行的远程主机ssh 服务器。

openssh 服务器通常在安装后启动并应用默认设置。如果没有,您可以使用基于systemd 的系统启动它

在基于Debian的Linux上使用systemd:

# systemctl start ssh
 

在RHEL / CentOS / Fedora和Arch Linux上:

# systemctl start sshd
 

或者在使用的新贵系统上

# service sshd start
 

组态

openssh/etc/ssh/ 下有配置文件。客户端也在~/.ssh/config 读取客户端配置。服务器正在使用文件sshd_config ,该文件包含大多数默认值并包含简单的键值对。例:

Protocol 2
PasswordAuthentication yes
ChallengeResponseAuthentication no
UsePAM yes
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY
X11Forwarding yes
Subsystem    sftp    /usr/libexec/openssh/sftp-server
 

SSH代理

如果您设置了长密码并且不想在每次要连接到服务器时继续输入密码,则可以在登录计算机时使用SSH-Agent存储密码。

在后台启动ssh-agent:

eval "$(ssh-agent -s)"
# Agent pid 59566
 

并将您的密钥添加到ssh-agent,系统将提示您输入密码:

ssh-add ~/.ssh/matrix.ac
# Enter passphrase for /home/osaka/.ssh/matrix.ac: 
# Identity added: /home/osaka/.ssh/matrix.ac (/home/osaka/.ssh/matrix.ac)
 

完成。现在连接ssh user@matrix.ac ,您不必输入密码。您可以使用gnome-keyring / seahorse,keychain和其他密钥管理器等程序来扩展它。