安全、便捷地远程登陆Linux

背景及问题

在vps上安装好的Linux服务器(server),我们会频繁的在自己的电脑上远程登陆它。为了省事儿,用户经常会在本机客户端(client)保存ssh的key文件,以避免频繁的输入密码。而新安装的系统,其默认用户是root。直接用root账户进行远程登陆是不安全的,所以我们的惯常做法是创建一个用普通用户,用普通用户进行无密码登陆; 在需要时,临时切换成root用户。

为了安全、便捷地登陆远程的Linux电脑,本文总结linux惯例,梳理出一种简洁的操作流程。具体包括两个步骤:

  1. 创建普通用户demo;并将部分属于root的文件夹的读写执行权限,赋予普通用户demo
  2. 使普通用户demo可以无密码进行远程登陆。

在文章的最后,本文对server上的shell进行了优化,以解决client端用户长时间不使用远程ssh,造成本地客户端“冻结”的现象。

方法步骤

创建普通用户demo

步骤一:暂时先以root用户远程登陆server

1
ssh root@remote-server

步骤二:创建用户demo, 用户主目录, 密码。(参考linux用户管理(1)—-创建用户(adduser和useradd)和删除用户(userdel))

1
adduser demo

步骤三:将/root/testDirectory的权限赋予普通用户demo,但不改变testDirectory的所有权。(参考Linux中ACl权限- getfacl, setfacl)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 查看/root/testDirectory的权限
ls -l
# drwxr-xr-x 2 root root 4096 Feb 23 13:39 testDirectory

# 安装acl
apt install acl

# 查看一下testDirectory文件夹的权限,便于以后对比结果
getfacl testDirectory/

# -----output-----
# # file: testDirectory/
# # owner: root
# # group: root
# user::rwx
# group::r-x
# other::r-x


# 为普通用户`demo`赋予文件夹testDirectory的rwx权限, 而改变所有权
setfacl -R -m u:demo:rwx testDirectory

# 查看权限
getfacl testDirectory/
# -----output-----
# # file: testDirectory/
# # owner: root
# # group: root
# user::rwx
# user:demo:rwx #该行显示,demo用户对该文件夹有了rwx的权限,而其它所有权仍然属于root
# group::r-x
# mask::rwx
# other::r-x

步骤四:切换到普通用户demo,测试他对testDirectory的权限

1
2
3
4
5
6
7
root@server:~# cd testDirectory/
root@server:~/testDirectory# su demo
demo@server:/root/testDirectory$ echo 'this is demo' > testFile
demo@server:/root/testDirectory$ ls
# testFile
demo@server:/root/testDirectory$ cat testFile
# this is demo

完美!

无密码远程登陆

无密码远程登陆Linux的技术原理,在Linux/UNIX下使用ssh-keygen设置SSH无密码登录中已经讲解的 很明白了。然而该文章给出的是三台服务器无密码的互联,可我们只需本地客户端(client)连接服务器(server)。这样的话,可以直接参考SSH无密码登录:只需两个简单步骤 (Linux)。非常简单,确实只需俩步骤。

步骤一:在本地client上生成ssh密钥和公玥。

1
ssh-keygen -b 4096 -t rsa

SSH密钥会保存在home目录下的.ssh/id_rsa文件中.SSH公钥保存在.ssh/id_rsa.pub文件中.

步骤二:将SSH公钥上传到Linux服务器。

1
ssh-copy-id demo@remote-server

公钥的内容就自动上传到服务器中的用户demo/home/demo/.ssh/authorized_keys文件中了。然后,我们就可以直接在本机1的shell中执行:

1
ssh demo@remote-server

无需再输入密码,直接就登陆进demo账户了。

server端shell优化

我们登陆到远程server后,常常就在那儿挂着一个shell,偶尔才想起来用一下。可是,远程server的默认设置,使得若一段时间没有操作,就会把远程ssh断开。 这个在我们本地的client为shell“冻住”了。为了能长时间挂机而不被server踢下去,我们需要对服务器的ssh会话进行一些设置。

1
2
cd /etc/ssh/
vi sshd_config

删除以下三行前的#, 并修改成所示的数值:

1
2
3
4
5
# TCPKeepAlive yes
# ClientAliveInterval 540 # 每一小段会话为540秒
# ClientAliveCountMax 7 # 共7段会话,总共63分钟。
# 重启ssh服务,使更改生效
service ssh restart

TODO: 以上内容不足以持续地保持会话,所以我需要再在client进行一些设置。在stackoverflow 上有个这么一个回答。How can I keep my SSH sessions from freezing?. 简单来讲,在本地的client上,编辑文件/etc/ssh/ssh_config如下:

1
2
Host *
ServerAliveInterval 100

ServerAliveInterval可以使client的ssh每一百秒发一个空的包,通知server上的ssh:喂,醒醒,别睡着了!就算挂机63分钟,也不会被服务器踢下去——够用了…

总结

自夸一下。本文总结出一套流程,该流程主要有以下三个步骤:

  1. 创建普通用户demo,并用setfacl灵活地为该普通用户定制权限;
  2. 实现了无密码远程登陆;
  3. 在server服务器端对ssh的会话进行优化。

该流程对于初级Linux小白用户是最简化的措施;实现安全、便捷地登陆远程Linux操作系统;并优化了ssh会话时间,以实现长时间挂机。


  1. 其实,我们只要把本机的密钥.ssh/id_rsa复制到其它任意电脑的.ssh文件夹下,就能够再任何电脑实现无密码登陆。

Donate comment here
Show comments from Gitment