SSH使用指南

SSH使用指南

目录

  • 简介
  • 历史
  • 入门
  • 进阶
  • 原理
  • 参考

简介

SSH(Secure Shell)是一种用于在不安全网络中进行操作网络服务的加密网络协议,提供两台电脑不安全网络间进行认证和加密数据传输。主要用于网络管理员进行远程管理使用,允许用户远程登录、远程执行命令和拷贝文件。

历史

Version 1.x

1995, 芬兰赫尔辛基科技大学的一个研究员Tatu Ylönen设计了第一版的协议(称为SSH-1),并发布了一版免费的软件。

  • 启发:校园网络受到密码嗅探攻击。
  • 目的:代替早期没有提供强认证和保密性的rlogin,Telnet,ftp和rsh协议。

1995的12月,Ylönen成立了一家公司SSH Communications Security来推广和开发SSH,并将后续的版本转为商业软件。

Version 2.x

SSH-2修订版在2006年确认为标准,在安全和特性上都胜过SSH-1,并和SSH-1不兼容。

Version 1.99

一个区分向下兼容的命名方法,指支持2.0和之前版本的一个协议版本。

OpenSSH和OSSH

1999年Björn Grönvall基于原始的SSH v1.2.12开源版本开发了OSSH,不久OpenBSD分叉了OSSH并创建了OpenSSH,此后OpenSSH继续维护广为移植,OSSH被淘汰。

OpenSSH 7.6版本移除了对SSH-1的支持。

入门

SSH可以在多平台下有多种应用场景,包括大部分的Unix变种(GNU/Linux,BSD包括MacOS,Solaris)和Windows。

使用场景:

  • 远程登录
  • 远程执行单个命令
  • 配置无密码登录远程机器
  • 配合rsync备份、拷贝和镜像文件
  • 端口转发或者端口隧道化
  • 实现一个成熟的VPN
  • 远程主机转发X window
  • 从支持Socks协议的SSH客户端进行安全的代理网页浏览
  • 使用SSHFS挂载远程主机的目录到本地主机文件系统
  • 自动化远程监控和管理服务器
  • 支持ssh的移动端或者嵌入式的开发

客户端

Unix和Linux系统中基本都包含ssh命令,这个命令启动SSH客户端用以在远程机器和SSH服务端建立安全的连接,通常使用的是OpenSSH SSH Client。

登录

1
ssh -p port_number remote_username@remote_host
  • -p port_number指定端口号,如果是默认22端口,可省略
  • remote_username为登录用户名
  • remote_host: 主机名,可以是域名或者IP

如果是首次连接该远程机器,则会出现以下的提示信息:

1
2
3
The authenticity of host 'example.com' cannot be established.
DSA key fingerprint is 04:48:30:31:b0:f3:5a:9b:01:9d:b3:a7:38:e2:b1:0c.
Are you sure you want to continue connecting (yes/no)?

选择yes继续后,将会添加这个服务器到你的已知主机列表中~/.ssh/known_hosts:

1
Warning: Permanently added 'example.com' (DSA) to the list of known hosts.

每台服务器都有一个key,上述的问题来确认和保存主机key,在下一次连接服务器时,会确认是否为同一台服务器。连接建立后,用户即认证成功。正常情况下,命令会要求用户输入密码。

退出

使用exit命令退出远程会话

1
exit

执行远程命令

ssh也可以用于不登录服务器直接远程执行命令

1
2
3
ssh host command

ssh host ls /opt

X11转发

1
ssh -X remote_host

服务端

启动ssh服务,服务端ssh的配置在进阶中讲解

1
2
3
4
sudo service ssh start

# 使用systemd的命令
sudo systemctl start ssh

进阶

使用SSH key登录

通过登录ssh时会使用每次输入密码的方式,不过使用SSH的key更方便和安全,配置key稍微麻烦一点,后续就是一劳永逸的事情,直接一条命令或者一个别名直接登录。

创建SSH Key

在你的客户端电脑创建ssh key:

1
ssh-keygen -t rsa

按回车确认,你的key会被创建在~/.ssh/id_rsa.pub和~/.ssh/id_rsa

切换到.ssh目录:

1
cd ~/.ssh

查看各文件的权限:

1
ls -l

输出结果如下:

1
2
3
-rw-r--r-- 1 demo demo  807 Sep  9 22:15 authorized_keys
-rw------- 1 demo demo 1679 Sep 9 23:13 id_rsa
-rw-r--r-- 1 demo demo 396 Sep 9 23:13 id_rsa.pub

id_rsa是仅文件拥有者可读,需要保持私密;id_rsa_pub可以被共享和读取。

传送公有Key到服务器

拷贝公有Key到服务器:

1
ssh-copy-id remote_host

这个命令会开启一个ssh会话,需要输入密码进行认证;输入密码成功后,将会拷贝公有Key到服务器的认证Key文件中,后续将允许不输入密码登录。

服务端SSH配置

服务端ssh配置是指配置sshd服务,默认情况,配置文件位于/etc/ssh/sshd_config

备份当前配置文件

1
sudo cp /etc/ssh/sshd_config{,.bak}

使用编辑器打开文件

1
sudo vi /etc/ssh/sshd_config

修改部分配置项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 修改端口号,默认为22,修改后客户端连接需要指定这里设置的端口
Port 22

# 设置主机的keys
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key

# 设置日志级别,排错时可增加日志级别,分别为QUIET, FATAL, ERROR, INFO, VERBOSE, DEBUG, DEBUG1, DEBUG2, and DEBUG3
SyslogFacility AUTH
LogLevel INFO

# 设置没有登录成功时的连接等待时间
LoginGraceTime 120

# 设置是否允许root用户登录,大多数普通用户能通过sudo提高权限并支持登录的话,该项应该设为yes
PermitRootLogin yes

# 设置安全防范,配置文件不安全时禁止登录
StrictModes yes

# 设置x窗口的转发
X11Forwarding yes
X11DisplayOffset 10

重启服务

上述设置保存后,需要重启服务才能生效

1
2
3
sudo service ssh restart
# 或
sudo systemctl restart ssh

检查配置修改是否有效,在修改配置的时候尽量保证有个用户已经登录连接,帮助设置有误时进行修改。

关闭密码认证

如果你可以安装了ssh key,并且可以通过key免密登录,否则关闭密码认证后将无法登录远程服务器。

使用管理员权限打开配置文件

1
sudo vi /etc/ssh/sshd_config

修改配置文件,关闭密码认证

1
PasswordAuthentication no

有两个配置需要确认设置正确

1
2
PubkeyAuthentication yes
ChallengeResponseAuthentication no

重启服务

1
2
3
sudo service ssh restart
# 或
sudo systemctl restart ssh

此时,密码认证将不可用,你的服务器将只能通过ssh key进行登录。

原理

基本原理

SSH的工作时通过客户端程序连接到ssh服务器。

基于Key的认证工作原理

基于Key认证的方式,需要一对Key,一个私有Key和一个公有Key。
私有Key保存在客户端电脑,并且要是安全和私密的。
公有Key放置在任何你想访问的服务器上。

当你通过键对访问时,服务器会使用公有Key创建一个消息给客户端,并且只有通过私有Key才能读取;接着,客户端发送合适的响应给服务端并认证。

参考

升级博客的Hexo和Next主题版本

本次升级更新了如下内容:

Hexo的版本,从3.3.8升级到3.7.1版本,没有重大的破坏性变更。

主题Next版本,从5.1升级到v6.4.2版本,两者间有不兼容的地方,配置需要重新配;另外,新版本的主题支持更多的特性。

有关Next主题的升级文档,这里给一下官方的指南,希望帮助有需要的朋友

hexo-theme-next中文文档

从 NexT v5.1.x 更新

升级过程中需要注意的是,v6和v5重大的变更之一是,插件依赖需要自己手动安装。

例如,假设你想要在你的站点中使用 fancybox 插件,请进入 NexT 配置文件,你会看到如下内容:

1
2
3
# Fancybox
# Dependencies: https://github.com/theme-next/theme-next-fancybox
fancybox: false

升级愉快!感谢next团队的贡献,v6带来了很多很棒的特性。

Git快速查找笔记

起步

三个配置文件

git config --system:文件位置/etc/gitconfig,系统级配置
git config --global:文件位置~/.gitconfig~/.config/git/config 文件,当前用户配置
.git/config:文件位置仓库.git/config,当前仓库配置

用户信息配置

1
2
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com

查看配置

git config --list:列出所有 Git 当时能找到的配置

获取帮助

1
2
3
$ git help <verb>
$ git <verb> --help
$ man git-<verb>
阅读更多

Google搜索引擎的使用指南

这篇文章第一版是在2018年写的,当时写的比较粗糙也没有配图,近期重新翻新并增加一些之前没有提到的功能点,主要作为自己平时的使用指南,如果能帮助到其他人那是更好的。

阅读更多

从npm到yarn

由于使用NPM在国内的安装速度很慢,找了一些解决方案,因此引出了Yarn + 淘宝源的使用方案,记录一下Yarn使用的方法

  1. Yarn简介
  2. Yarn安装
  3. NPM源配置
  4. Yarn使用

Yarn简介

Yarn是FaceBook推出的一款基于nodejs的依赖管理工具,在npm基础上做了一些改进。Github上的star已经超过30k。

超快

Yarn caches every package it downloads so it never needs to download it again. It also parallelizes operations to maximize resource utilization so install times are faster than ever.

非常安全

Yarn uses checksums to verify the integrity of every installed package before its code is executed.

超可靠

Using a detailed, but concise, lockfile format, and a deterministic algorithm for installs, Yarn is able to guarantee that an install that worked on one system will work exactly the same way on any other system.

详细的优点可参看知乎的评价文章如何评价Facebook推出的JavaScript模块管理器yarn?

Yarn安装

这里列一下MacOS下的安装方法:

使用Homebrew进行安装,如果没有安装Node.js会自动进行安装

1
brew install yarn

如果已经使用nvm或者类似的工具安装过Node.js,可以选择忽略安装

1
brew install yarn --without-node

验证是否安装成功:

1
yarn --version

NPM源配置

有两种方法:

一、直接配置

1
2
3
4
// 配置registry
npm config set registry https://registry.npm.taobao.org/

npm config get registry

二、使用nrm切换npm源

1
2
3
4
5
6
7
8
9
10
11
// 安装nrm
npm i nrm -g

// 列出所有可用的registry
nrm ls

// 使用淘宝源
nrm use taobao

// 测试速度
nrm test

建议使用第二种方案

Yarn使用

列举一些常用的命令:

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
// 新建一个项目
yarn init

// 添加依赖
yarn add [package]
yarn add [package]@[version]
yarn add [package]@[tag]

// 添加其他类型的依赖到项目中
// 其中dev是开发依赖;peer一般用于开发库;
// optional为可选依赖,安装过程中报错也可忽略
yarn add [package] --dev
yarn add [package] --peer
yarn add [package] --optional

// 升级依赖
yarn upgrade [package]
yarn upgrade [package]@[version]
yarn upgrade [package]@[tag]

// 移除依赖
yarn remove [package]

// 安装一个项目的所有依赖
yarn

// 或者
yarn install

Sublime Text 3 安装eslint的JavaScript ES5版本插件总结

ESLint在JavaScript静态代码检测中变得很流行了,主要有几个原因:第一,容易配置;第二,混合了JShint和JSCS;第三,大神Nicholas Zakas写的,写JavaScript红宝石的作者。

安装ESLint

安装ESLint之前,确保环境中已经安装Node.js和npm。

npm install -g eslint

可以选择全局安装,也可以选择安装在项目本地。

阅读更多

设定目标-使用SMART法则

大纲:

设定目标的意义和常见的问题
使用SMART法则设定适当的目标
执行、检查和修正目标

设定目标的意义和常见的问题

目标犹如一座灯塔,设定了一个准确的目标,能够帮助我们达到我们想要的目的。

准确的设定目标,是目标能够达成的前提条件之一。而我们通常遇到的问题,比较严重的就是,没有
准确的设定目标,导致目标在执行过程中,出现以下的几类问题:
1、不知道如何评判是否达成目标
2、没有时间期限导致拖延
3、目标太模糊、太大,导致无法实现而放弃

阅读更多

nginx访问页面报403的解决方法

近期搭建一个Wordpress站点,前期的准备工作完成,登录界面登录成功后,
显示的页面为403,禁止访问。

在网上搜索后,发现问题在于权限的问题,主要是页面文件所在的文件夹的访问
权限。由于nginx默认使用的用户权限无法访问页面的文件,导致报的403。

解决方法:

1、打开nginx.conf文件修改启动用户

1
$ vim /user/local/nginx/conf/nginx.conf

修改开头的用户,
#user nobody

改为
user nginx web;

或者其他用户,格式为用户[空格]用户组

2、重新启动nginx

1
$ /user/local/nginx/sbin/nginx -s reload

此时,重新测试,应该就可以访问成功了。

ssh密钥登录配置

配置密钥可使用户免密ssh方式登录服务器。

配置方法:

生成密钥对

1
$ ssh-keygen

此处可选择生成密钥的文件路径,默认为~/.ssh/id_rsa
密码为可选。

拷贝公钥到服务器

方式一:

1
$ ssh-copy-id -i ~/.ssh/id_rsa.pub xxx@host

方式二:

手动拷贝id_rsa.pub到服务器上,并收到添加认证文件。

1
$ cat id_rsa.pub >> ~/.ssh/authorized_keys

服务器配置

配置服务器上/etc/ssh/sshd_config文件,修改以下配置项

1
2
3
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

修改后,重启sshd服务,根据不同的系统使用相应命令

登录

直接登录

1
$ ssh user@host

如果配置成功,则不需要密码直接登录。

问题

配置成功后,仍提示密码输入

主要原因在于服务器上认证文件及所在目录的权限问题

详情排查步骤可查看文章配置ssh公钥登录提示还是输入密码

解决方法:

1
$ chmod 755 ~/home/xxxuser