参考:https://github.com/wangdoc/ssh-tutorial
ssh是一个加密协议,通常用于远程登陆服务器为了避免明文传输导致的不安全。ssh分为服务端和客户端,被登录的服务器安装ssh服务端,要登陆的用户是ssh客户端。
SSH服务端
ssh服务端称为sshd,Ubuntu安装:sudo apt-get install openssh-server
。
sshd配置文件
sshd 的配置文件在/etc/ssh
目录,主配置文件是sshd_config
,此外还有一些安装时生成的密钥。
/etc/ssh/sshd_config
:配置文件
注意,如果重装 sshd,上面这些密钥都会重新生成,导致客户端重新连接 ssh 服务器时,会跳出警告,拒绝连接。为了避免这种情况,可以在重装 sshd 时,先备份/etc/ssh
目录,重装后再恢复这个目录。或者客户端运行:ssh-keygen -R hostname
删除原来的公钥指纹,再次连接。
配置文件sshd_config
的格式是,每个命令占据一行。每行都是配置项和对应的值,配置项的大小写不敏感,与值之间使用空格分隔。
Port 2034
上面的配置命令指定,配置项Port
的值是2034
。Port
写成port
也可。
配置文件还有另一种格式,就是配置项与值之间有一个等号,等号前后的空格可选。
Port = 2034
配置文件里面,#
开头的行表示注释。
# 这是一行注释
注意,注释只能放在一行的开头,不能放在一行的结尾。
Port 2034 # 此处不允许注释
上面的写法是错误的。
另外,空行等同于注释。
sshd 启动时会自动读取默认的配置文件。如果希望使用其他的配置文件,可以用 sshd 命令的-f
参数指定。
$ sshd -f /usr/local/ssh/my_config
上面的命令指定 sshd 使用另一个配置文件my_config
。
修改配置文件以后,可以用 sshd 命令的-t
(test)检查有没有语法错误。
$ sshd -t
配置文件修改以后,并不会自动生效,必须重新启动 sshd。
$ sudo systemctl restart sshd.service
SSH客户端
Ubuntu安装:sudo apt-get install openssh-client
。
基本用法
ssh username@hostname
如果是第一次连接,需要保存服务器公钥指纹(服务器公钥经过hash之后的值),以后每次连接需要验证这个指纹。所有的公钥指纹存在~/.ssh/known_hosts
文件中。
SSH命令行配置
-c
-c
参数指定加密算法。
$ ssh -c blowfish,3des server.example.com
# 或者
$ ssh -c blowfish -c 3des server.example.com
上面命令指定使用加密算法blowfish
或3des
。
-i
-i
参数用于指定私钥,意为“identity_file”,默认值为~/.ssh/id_dsa
(DSA 算法)和~/.ssh/id_rsa
(RSA 算法)。注意,对应的公钥必须存放到服务器,详见《密钥登录》一章。
$ ssh -i my-key server.example.com
-p
-p
参数指定 SSH 客户端连接的服务器端口。
$ ssh -p 2035 server.example.com
上面命令连接服务器的2035端口。
SSH密钥登陆
一种客户端免除输入密码的登陆方式。
密钥登陆过程
- 客户通过
ssh-keygen
生成自己的公钥密钥。 - 手动将客户的公钥放在服务器的指定位置
- 客户端向服务器发送SSH登录请求
- 服务端收到后明文发送一段随机数据给客户
- 客户收到之后用自己的私钥加密这段数据(签名)发送给服务器
- 服务器用客户端提供给自己的公钥解密,如果与原始数据一致,则允许登录。
ssh-keygen:生命密钥
通常使用参数t指定密钥的加密算法:ssh-keygen -t dsa
生成密钥以后,建议修改它们的权限,防止其他人读取。
$ chmod 600 ~/.ssh/id_rsa
$ chmod 600 ~/.ssh/id_rsa.pub
配置项
ssh-keygen
的命令行配置项,主要有下面这些。
(1)-b
-b
参数指定密钥的二进制位数。这个参数值越大,密钥就越不容易破解,但是加密解密的计算开销也会加大。
一般来说,-b
至少应该是1024
,更安全一些可以设为2048
或者更高。
(2)-C
-C
参数可以为密钥文件指定新的注释,格式为username@host
。
下面命令生成一个4096位 RSA 加密算法的密钥对,并且给出了用户名和主机名。
$ ssh-keygen -t rsa -b 4096 -C "your_email@domain.com"
(3)-f
-f
参数指定生成的私钥文件。
$ ssh-keygen -t dsa -f mykey
上面命令会在当前目录生成私钥文件mykey
和公钥文件mykey.pub
。
(4)-F
-F
参数检查某个主机名是否在known_hosts
文件里面。
$ ssh-keygen -F example.com
(5)-N
-N
参数用于指定私钥的密码(passphrase)。
$ ssh-keygen -t dsa -N secretword
(6)-p
-p
参数用于重新指定私钥的密码(passphrase)。它与-N
的不同之处在于,新密码不在命令中指定,而是执行后再输入。ssh 先要求输入旧密码,然后要求输入两遍新密码。
(7)-R
-R
参数将指定的主机公钥指纹移出known_hosts
文件。
$ ssh-keygen -R example.com
(8)-t
-t
参数用于指定生成密钥的加密算法,一般为dsa
或rsa
上传公钥
客户端的公钥一般放在服务器的~/.ssh/authorized_keys
,每个公钥占一行。权限是644。