Linux下SSH免密登录设置

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

查看SSH安装状态

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

创建.ssh文件

然后关闭防火墙sudo ufw disable

关闭防火墙

最后使用ifconfig命令查询服务器的IP地址备用。如图,我的Ubuntu的IP地址是192.168.10.130

查看IP

到此,服务端配置完毕。

3、客户端配置

对客户端系统没有要求,可以是Linux、Mac OS、Windows。如果你要配置Windows,需要先安装Bash,常用的Bash软件有很多。我使用的是GitBsah类似于Windows的命令行cmd,能够提供很多类似Unix系统的操作命令和功能。

在Bash中,进入~目录(C:\Users\LIAO目录),查看有没有.ssh目录,以及.ssh目录下有没有id_rsaid_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,登录成功。

ssh登录

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

当然Python能做的事其实和bash差不多,所以没有人会这样来设置Python,这里只是用来演示。一般来说,都会设置为某些专用功能,比如git等,利用该程序内部的逻辑来限制用户的权限。这样可以大大提高服务器的安全性。