0、SSH登录原理简介
SSH
是一种远程会话安全协议协议,英文全称是Secure Shell。为了免密登录远程服务器,我们需要预先创建好一个密钥对,分为公钥与私钥。并将公钥预先存放于服务器端。当有远程客户端发起SSH
访问时,服务器会向客户端发送一段随机字符串,随后客户端用自己的私钥将其加密返回给服务器。如果服务器能用预先保存的公钥将其解密,即认可该客户端的身份,允许接入。
在Linux中SSH
分为客户端openssh-client
和服务端openssh-server
,如果你需要使用本机SSH访问其他机器,需要安装客户端,如果本机需要被其他机器访问,则需要安装服务端。一般情况下,用ssh
表示客户端,用sshd
表示服务端。Ubuntu会预装客户端而没有服务端,Centos两者都会安装。以Ubuntu为例查看是否有安装的方法是:
# 查看是否安装了openssh-client,有ssh_config即为已安装
$ ls /etc/ssh*
# 查看是否安装了openssh-server,有sshd_config即为已安装
$ ls /etc/ssh/sshd*
下图显示的即为系统中未安装openssh-server
。
1、准备工作:sshd安装
正常情况下,可以直接在线安装openssh-server
:
$ sudo apt install openssh-server
但有的时候会出错,说找不到安装包,或者网络连接失败等。在网络连通的情况下,一般都是因为在国内访问被墙了,因此我们需要修改下载源,即/etc/apt/source.list
文件。
# 不熟悉vim的同学,可以使用sudo gedit /etc/apt/source.list来编辑
sudo vim /etc/apt/source.list
删掉文件里的所有内容(放心删),填写以下内容并保存:
deb http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse
然后依次执行以下两个命令,中间会有部分更新失败,将下面的命令多执行几次确保数据全部更新:
sudo apt-get update
sudo apt-get upgrade
然后再回到上面安装openssh-server
。安装完毕后执行ps -e |grep sshd
命令查看sshd
是否运行,如果发现有sshd
即为已经运行。如果没有,则执行sudo /etc/init.d/ssh start
来启动。
2、服务端配置
编辑/etc/ssh/sshd_config
,确保下面的内容生效:
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile ~/.ssh/authorized_keys
执行sudo /etc/init.d/ssh restart
重启sshd
服务。
现在需要选择你要远程登录的身份。你可以选择使用root
用户登录,也可以选择使用普通用户登录。一般来说root
用户的权限太大,因此推荐使用普通用户。登录以后再使用su -
来执行高权限操作。下面我们以一个普通用户liao
为例(root
用户操作同理)。
选择你的身份su liao
,进入用户的家目录cd ~
,创建一个.ssh
文件夹mkdir .ssh
,修改文件夹权限chmod 750 .ssh
,进入该文件夹cd .ssh
,新建authorized_keys
文件touch authorized_keys
,修改文件权限chmod 640 authorized_keys
。
然后关闭防火墙sudo ufw disable
。
最后使用ifconfig
命令查询服务器的IP地址备用。如图,我的Ubuntu的IP地址是192.168.10.130
。
到此,服务端配置完毕。
3、客户端配置
对客户端系统没有要求,可以是Linux、Mac OS、Windows。如果你要配置Windows,需要先安装Bash
,常用的Bash软件有很多。我使用的是Git
。Bsah
类似于Windows的命令行cmd
,能够提供很多类似Unix系统的操作命令和功能。
在Bash中,进入~
目录(C:\Users\LIAO
目录),查看有没有.ssh
目录,以及.ssh
目录下有没有id_rsa
和id_rsa.pub
这两个文件。如果都有跳过这一段。否则执行ssh-keygen -t rsa
,然后一路回车到底。这样你就获得了一对秘钥。其中id_rsa.pub
是公钥,可以公开,id_rsa
是私钥不能公开。
生成完密钥对后,执行以下命令:
scp .ssh/id_rsa.pub liao@192.168.10.130:~/.ssh/authorized_keys
这条命令作用是,将客户端id_rsa.pub
里面的内容,发送到服务端,并存储到~/.ssh/authorized_keys
中。这里的liao
要换成你登录服务器所要用的用户名,IP是服务器的IP。中途会问你服务器是否可信,输入yes
,接着连接服务器,要求你输入liao
用户的密码,输入。
网上的大多数教程都推荐使用上面的命令,但是这条命令有时候会出现权限错误。因此可以使用下面的命令代替,功能是一样的:
cat .ssh/id_rsa.pub | ssh liao@192.168.10.130 "cat - >>~/.ssh/authorized_keys"
到这里,客户端也配置完毕。
4、测试
在客户端Bash执行ssh liao@192.168.10.130
,登录成功。
5、高级用法
有的时候,我们不想让远程登录到bash
,因为Bash的操作权限还是太大了,比如我们只想用liao
这个用户来操作git
命令,来管理代码仓库,而禁止他登录远程服务器的bash
。这就需要修改用户的登录配置了。
下面以liao
用户只能登录后执行Python
为例(其他同理):
# 服务器上
sudo vim /etc/passwd
# 找到liao用户,类似于这样的:
liao:x:1000:1000:liao,,,:/home/liao:/bin/bash
这条数据被冒号分割为7个部分,各部分的详细介绍看这里,其中最后一部分即为用户登录后启动的程序。老版本的Linux系统一般为/bin/sh
或者/bin/shell
。新版本的一般都是/bin/bash
,只是名字不同,但是一个东西。
我们要把最后一部分修改为/usr/bin/python3.5
,则用户登录后就直接进入了Python shell
。或者修改为/bin/false
则是禁止登入bash
,但是可以执行其他的远程命令。下图为Python
的示例,在登录后会直接进入Python3.5
。当你在Python Shell
中执行exit()
时,会直接退出登录,而不是退出到bash
,从而限制了用户的操作。
当然Python
能做的事其实和bash
差不多,所以没有人会这样来设置Python
,这里只是用来演示。一般来说,都会设置为某些专用功能,比如git
等,利用该程序内部的逻辑来限制用户的权限。这样可以大大提高服务器的安全性。