Tag Archive: ssh

1月 7th, 2022

一旦会发现来自特定 IP 的滥用行为,这通常是由于机器人访问您的网站。但是,您也可能会发现与过度浏览您网站的机器人无关的 IP。

本节列出了一些您可以通过SSH运行的命令,以帮助识别哪些 IP 正在访问您的站点。推荐阅读:《 SSH访问如何在共享主机计划中生效? 》

登录您的服务器

要运行以下命令,您必须首先通过 SSH 登录到您的服务器:

SSH 概述

登录后,导航到正确的日志目录。

我应该查看哪个日志目录?

如果您已将SSL 证书添加到您的网站,您将看到两个文件夹。一种用于/http,一种用于/https。例如:

/logs/example.com/http

/logs/example.com/https

如果您访问您的站点并看到它在 URL ( https://example.com ) 中使用HTTPS,则这意味着您应该查看/https目录。如果您的站点在访问时显示HTTP,您将改为查看/http目录。以下示例假定您的站点使用HTTPS。

cd ~/logs/ example.com /https

您将在此处运行以下命令。

列出 IP 命中

列出顶级文件、文件夹和域

VPS主机或美国linux服务器上的 SHELL 用户

以下命令仅显示单个Shell 用户下的站点。如果您需要查看服务器上的所有站点日志,请查看下面标题为“美国linux服务器上的管理员用户”的部分。推进阅读:《什么是SSH密钥,如何结合Linux服务器使用它》

美国linux服务器上的管理员用户

以下命令仅在您的美国linux服务器上有“管理员”用户时才有效。然后您必须切换到您的“root”用户。只有这样,您才能看到服务器上所有站点的所有日志。

以“管理员”用户身份登录后如何切换到“root”用户

以下步骤详细说明了在首先以“admin”用户身份登录后如何以“root”用户身份登录到您的服务器。

1.以您的“管理员”用户身份登录您的服务器。

2.运行sudo 是:

3.输入您的“管理员”用户的密码。

4.您现在以“root”用户身份登录。您可以在命令提示符中看到这一点:

以“root”用户身份登录后,运行以下命令以查看服务器上所有站点的日志。

我的唯一 IP 建立了很多连接

您可能会在 access.log 中发现您站点的唯一 IP 正在建立大量连接。这不是问题,可以安全地忽略。

发生这种情况是因为 Apache 在内部生成这些连接以关闭不需要的进程。

故障排除

运行命令查看服务器上所有域的所有流量后,您可能会看到以下错误响应。

当您以 SFTP 用户身份运行该命令时会发生此错误。您必须以 VPS主机上的“Shell”用户或美国linux服务器上的“Shell”或“Admin”用户身份运行它。推荐阅读:《解决SSH登录用户执行的命令部分环境变量参数不生效的问题》

3月 31st, 2018

Linux的管理用户是root,远程连接的默认端口是22,这是通常有IT经验的人都知道的。为了系统安全,我们通常都会修改这些默认的设置,下面就说下怎么修改ssh的配置。实验用的系统为CentOS6.9,其他的Linux也可以参考。

1、修改ssh连接的端口

ssh的端口默认为22,我们可以通过修改配置文件改为一个非著名的端口,比如2222.

vim /etc/ssh/sshd_config

用vim编辑器打开sshd_config,把22端口改为2222,然后保存退出。

注意:配置文件生效之前,我们要在防火墙放行2222端口,设置iptables。

iptables -I INPUT -p tcp -m tcp –dport 2222 -j ACCEPT    #放行2222端口
/etc/init.d/iptables save    #保存iptables配置
/etc/init.d/iptables restart    #重启iptables服务

重载ssh配置文件,不建议用restart来重启ssh服务,这样会影响到现有的ssh连接。

/etc/init.d/sshd reload

然后用XShell重新连接看看,连接成功。

2、禁止root用户直接ssh连接

root这个帐号是所有人都知道并且拥有最高权限的帐号,直接暴露在网络中不大安全,我们可以禁止ssh使用root连接,同样只需要修改ssh的配置文件即可。在这里要确认自己的系统有一个可以登录的普通帐号,用该帐号登录之后再su -切换到root,或者将该帐号加入sudoers里面。

用vim编辑器打开ssh的配置文件,找到PermitRootLogin那行,去掉注释,参数改为no,或者直接在最后几行加入下面的几条参数。(这几个命令都可以在配置文件找到的)

PermitRootLogin no        #是否允许root登录
PermitEmptyPasswords no        #是否允许空密码登录
UseDNS yes        #是否对远程主机名进行反向解析,关闭会提高连接的速度
GSSAPIAuthentication no        #解决Linux之间使用ssh连接慢的问题

修改之后,保存退出,然后重新加载ssh文件即可。

3、其他

如果对安全有更高的要求,可以更高ssh的监听ip,使其只监听内网的ip。可以通过防火墙来限制来源的IP地址

iptables -I INPUT -s 192.168.17.0/24 -p tcp –dport 2222 -j ACCEPT
/etc/init.d/iptables save
/etc/init.d/iptables restart

TAGS:
12月 31st, 2017

今天服务器重启,突然发现ssd服务不能正常启动了,提示如下错误:

image
如果只是看这个提示,我们并不能发现究竟是什么错误,这时我想起sshd命令一个重要的排查问题的参数-t
image
原来我在做web站点用户授权时,误把整个/var目录授权为apache.apache,而sshd服务成功起动需要/var/empty/sshd必须所有者是root
将权限改回来即可
image

TAGS:
10月 16th, 2017

最近自己买了个服务器,用ssh连接时一段时间不操作就要重新连接,让人很是麻烦。现在终于解决了,步骤很简单。
登陆服务器后输入 lsb_release -a 可以查看系统版本,此命令适用于所 有的linux,包括Redhat、SuSE、Debian等发行版,但是在debian下要安装lsb。如:

[root@chen /]# lsb_release -a
LSB Version:    :core-4.1-amd64:core-4.1-noarch
Distributor ID: CentOS
Description:    CentOS Linux release 7.3.1611 (Core) 
Release:        7.3.1611
Codename:       Core

此方法适用于centos7的版本。用文本编译器打开ssh服务里面的一个配置文件。代码如下:

[root@chen /]# vi /etc/ssh/sshd_config 
#       $OpenBSD: sshd_config,v 1.93 2014/01/10 05:59:19 djm Exp $

# This is the sshd server system-wide configuration file.  See
# sshd_config(5) for more information.

# This sshd was compiled with PATH=/usr/local/bin:/usr/bin

# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where

此时已经进入配置文件里面了,输入 i 进入编辑模式,找到如下代码:

#PermitUserEnvironment no#Compression delayed
#ClientAliveInterval 0
#ClientAliveCountMax3
#ShowPatchLevel no
#PidFile /var/run/sshd.pid
#MaxStartups 10:30:100
#PermitTunnel no
#ChrootDirectory none
#VersionAddendum none

#ClientAliveInterval 0
#ClientAliveCountMax3

去掉注释并改为

ClientAliveInterval 60
ClientAliveCountMax 3

ClientAliveInterval指定了服务器端向客户端请求消息 的时间间隔, 默认是0, 不发送.而ClientAliveInterval 60表示每分钟发送一次, 然后客户端响应, 这样就保持长连接了.ClientAliveCountMax, 使用默认值3即可.ClientAliveCountMax表示服务器发出请求后客户端没有响应的次数达到一定值, 就自动断开. 正常情况下, 客户端不会不响应。  最后一定要记得重启ssh服务,否则是不会生效的,重启代码如下:

[root@chen /]# systemctl restart sshd.service
[root@chen /]# 

然后就OK啦。另外悄悄告诉你判断ssh服务有没有启动的命令是:

[root@chen /]# systemctl status  sshd.service
?sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2017-09-21 16:57:34 CST; 2min 35s ago
     Docs: man:sshd(8)
           man:sshd_config(5)
 Main PID: 9640 (sshd)
   CGroup: /system.slice/sshd.service9640 /usr/sbin/sshd -D

看到running就是启动了,如果没有启动的话输入

systemctl start sshd.service

就启动完成了。设置开机自启动的话则输入:

systemctl enable sshd.service
TAGS: ,
9月 28th, 2017
当你查看你的 SSH 服务日志,可能你会发现充斥着一些不怀好意的尝试性登录。这里有 5 条常规建议(和一些个别特殊策略)可以让你的 OpenSSH 会话更加安全。
强化密码登录

密码登录很方便,因为你可以从任何地方的任何机器上登录。但是它们在暴力攻击面前也是脆弱的。尝试以下策略来强化你的密码登录。

  • 使用一个密码生成工具,例如 pwgen。pwgen 有几个选项,最有用的就是密码长度的选项(例如,pwgen 12产生一个12位字符的密码)
  • 不要重复使用密码。忽略所有那些不要写下你的密码的建议,然后将你的所有登录信息都记在一个本子上。如果你不相信我的建议,那总可以相信安全权威 Bruce Schneier 吧。如果你足够细心,没有人能够发现你的笔记本,那么这样能够不受到网络上的那些攻击。
  • 你可以为你的登录记事本增加一些额外的保护措施,例如用字符替换或者增加新的字符来掩盖笔记本上的登录密码。使用一个简单而且好记的规则,比如说给你的密码增加两个额外的随机字符,或者使用单个简单的字符替换,例如 “#” 替换成 “*”。
  • 为你的 SSH 服务开启一个非默认的监听端口。是的,这是很老套的建议,但是它确实很有效。检查你的登录;很有可能 22 端口是被普遍攻击的端口,其他端口则很少被攻击。
  • 使用 Fail2ban 来动态保护你的服务器,是服务器免于被暴力攻击。
  • 使用不常用的用户名。绝不能让 root 可以远程登录,并避免用户名为“admin”。
解决 Too Many Authentication Failures 报错

当我的 ssh 登录失败,并显示“Too many authentication failures for carla”的报错信息时,我很难过。我知道我应该不介意,但是这报错确实很碍眼。而且,正如我聪慧的奶奶曾经说过,伤痛之感并不能解决问题。解决办法就是在你的(客户端的)

~/.ssh/config

文件设置强制密码登录。如果这个文件不存在,首先创个

~/.ssh/

目录。

$ mkdir ~/.ssh
$ chmod 700 ~/.ssh

然后在一个文本编辑器创建

~/.ssh/confg

文件,输入以下行,使用你自己的远程域名替换 HostName。

HostName remote.site.com
PubkeyAuthentication=no

(LCTT 译注:这种错误发生在你使用一台 Linux 机器使用 ssh 登录另外一台服务器时,你的 .ssh 目录中存储了过多的私钥文件,而 ssh 客户端在你没有指定 -i 选项时,会默认逐一尝试使用这些私钥来登录远程服务器后才会提示密码登录,如果这些私钥并不能匹配远程主机,显然会触发这样的报错,甚至拒绝连接。因此本条是通过禁用本地私钥的方式来强制使用密码登录——显然这并不可取,如果你确实要避免用私钥登录,那你应该用 -o PubkeyAuthentication=no 选项登录。显然这条和下两条是互相矛盾的,所以请无视本条即可。)

使用公钥认证

公钥认证比密码登录安全多了,因为它不受暴力密码攻击的影响,但是并不方便因为它依赖于 RSA 密钥对。首先,你要创建一个公钥/私钥对。下一步,私钥放于你的客户端电脑,并且复制公钥到你想登录的远程服务器。你只能从拥有私钥的电脑登录才能登录到远程服务器。你的私钥就和你的家门钥匙一样敏感;任何人获取到了私钥就可以获取你的账号。你可以给你的私钥加上密码来增加一些强化保护规则。

使用 RSA 密钥对管理多个用户是一种好的方法。当一个用户离开了,只要从服务器删了他的公钥就能取消他的登录。

以下例子创建一个新的 3072 位长度的密钥对,它比默认的 2048 位更安全,而且为它起一个独一无二的名字,这样你就可以知道它属于哪个服务器。

$ ssh-keygen -t rsa -b 3072 -f id_mailserver

以下创建两个新的密钥,

id_mailserver

id_mailserver.pub
id_mailserver

是你的私钥–不要传播它!现在用

ssh-copy-id

命令安全地复制你的公钥到你的远程服务器。你必须确保在远程服务器上有可用的 SSH 登录方式。

$ ssh-copy-id -i  id_rsa.pub user@remoteserver

/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
user@remoteserver's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'user@remoteserver'"
and check to make sure that only the key(s) you wanted were added.

ssh-copy-id 会确保你不会无意间复制了你的私钥。从上述输出中复制登录命令,记得带上其中的单引号,以测试你的新的密钥登录。

$ ssh 'user@remoteserver'

它将用你的新密钥登录,如果你为你的私钥设置了密码,它会提示你输入。

取消密码登录

一旦你已经测试并且验证了你的公钥可以登录,就可以取消密码登录,这样你的远程服务器就不会被暴力密码攻击。如下设置你的远程服务器

/etc/sshd_config

文件。

PasswordAuthentication no

然后重启服务器上的 SSH 守护进程。

设置别名 — 这很快捷而且很酷

你可以为你的远程登录设置常用的别名,来替代登录时输入的命令,例如

ssh -u username -p 2222 remote.site.with.long-name

你可以使用

ssh remote1

你的客户端机器上的 ~/.ssh/config文件可以参照如下设置

Host remote1
HostName remote.site.with.long-name
Port 2222
User username
PubkeyAuthentication no

如果你正在使用公钥登录,可以参照这个:

Host remote1
HostName remote.site.with.long-name
Port 2222
User username
IdentityFile  ~/.ssh/id_remoteserver

OpenSSH 文档 很长而且详细,但是当你掌握了基础的 SSH 使用规则之后,你会发现它非常的有用,而且包含很多可以通过 OpenSSH 来实现的炫酷效果。

原文来自:https://linux.cn:443/article-7683-1.html

本文地址:http://www.linuxprobe.com/five-safety-advice.html

TAGS: ,
8月 11th, 2017

修改 sshd_config 端口

$ vi /etc/ssh/sshd_config

取消 #Port 22 的注释,在下一行添加你需要修改的新端口 Port 2048。(这里不删除 22 端口是为了防止修改后新端口无法访问,造成无法用 ssh 连接服务器。)

Port 22  
Port 2048

修改保存 sshd_config 文件后重启 sshd 服务:

Bash

$  systemctl restart sshd

退出 ssh 会话后,再用新的端口连接:

Bash

$ ssh -p 2048 root@example.com
ssh: connect to host 0.0.0.0 port 2048: Connection refused

好吧,native 了……对于 CentOS 7 这一套修改端口的方法已经不能生效了。

打开 SELinux 端口

SELinux 全称 Security Enhanced Linux (安全强化 Linux),是 MAC (Mandatory Access Control,强制访问控制系统)的一个实现,目的在于明确的指明某个进程可以访问哪些资源(文件、网络端口等)。

对于 ssh,SELinux 默认只允许 22 端口,我们可以用 SELinux 管理配置工具 semanage,来修改 ssh 可访问的端口。

安装 semanage 工具

Bash

$ yum provides semanage
$ yum -y install policycoreutils-python
为 ssh 打开 2048 端口

Bash

# 为 ssh 添加新的允许端口$ semanage port -a -t ssh_port_t -p tcp 2048# 查看当前 SELinux 允许的端口$ semanage port -l | grep sshssh_port_t                     tcp      2048, 22
错误处理

当 SELINUX 配置为禁用状态时,使用 semanage 会报错提示无法读取 policy 文件:

SELinux:  Could not downgrade policy file /etc/selinux/targeted/policy/policy.30, searching for an older version.  
SELinux:  Could not open policy file <= /etc/selinux/targeted/policy/policy.30:  No such file or directory  
/sbin/load_policy:  Can't load policy:  No such file or directory
libsemanage.semanage_reload_policy: load_policy returned error code 2. (No such file or directory).  
FileNotFoundError: [Errno 2] No such file or directory

修改 /etc/selinux/config 配置,启用 SELinux:

Bash

$ vi /etc/selinux/config
SELINUX=permissive  
# 重启服务器$ init 6# 重启后查看 SELinux 状态$ sestatus# if it shows disable, you can run$ load_policy -qi
检查配置:

Bash

$ semanage port -a -t ssh_port_t -p tcp 2048
$ semanage port -l | grep sshssh_port_t                     tcp      2048, 22  
# 重启 ssh 服务systemctl restart sshd

注:semange 不能禁用 ssh 的 22 端口:

Bash

$ semanage port -d -t ssh_port_t -p tcp 22
ValueError: 在策略中定义了端口 tcp/22,无法删除。

配置防火墙 firewalld

启用防火墙 && 查看防火墙状态:

Bash

$ systemctl enable firewalld
$ systemctl start firewalld
$ systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since 二 2016-12-20 02:12:59 CST; 1 day 13h ago
 Main PID: 10379 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─10379 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
$ firewall-cmd --state
running
查看防火墙当前「默认」和「激活」zone(区域):

Bash

$ firewall-cmd --get-default-zone
public  
$ firewall-cmd --get-active-zones
public  
  interfaces: eth0 eth1

若没有激活区域的话,要执行下面的命令。

激活 public 区域,增加网卡接口:

Bash

$ firewall-cmd --set-default-zone=public
$ firewall-cmd --zone=public --add-interface=eth0
success  
$ firewall-cmd --zone=public --add-interface=eth1
success
为 public zone 永久开放 2048/TCP 端口:

Bash

# 以防新端口不生效,先把 22 端口暴露$ firewall-cmd --permanent --zone=public --add-port=22/tcp
$ firewall-cmd --permanent --zone=public --add-port=2048/tcp
success  
# 重载防火墙$ firewall-cmd --reload# 查看暴露端口规则$ firewall-cmd --permanent --list-port
443/tcp 80/tcp 22/tcp 2048/tcp  
$ firewall-cmd --zone=public --list-all
public (default, active)  
  interfaces: eth0 eth1
  sources:
  services: dhcpv6-client ssh
  ports: 443/tcp 80/tcp 22/tcp 2048/tcp
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

退出 ssh 后,尝试连接新端口

Bash

$ ssh -p 2048 root@example.com

成功登录的话,就可以做收尾工作了。

禁用 22 端口

删除 ssh 允许端口

Bash

$ vi /etc/ssh/sshd_config#Port 22Port 2048  
$ systemctl restart sshd# 用 ss 命令检查 ssh 监听的端口,没有 22 证明修改成功$ ss -tnlp | grep sshLISTEN     0      128                       *:2048                    *:*      users:(("sshd",18233,3))
防火墙移除 22 端口

Bash

$ firewall-cmd --permanent --zone=public --remove-port=22/tcp
success  
$ firewall-cmd --reload
$ firewall-cmd --permanent --list-port
443/tcp 80/tcp 2048/tcp

ssh 取消监听 22 端口,就已经配置好了,防火墙只不过是在 ssh 外多一层访问限制。如果要做的更好还可以将 22 端口的访问流量转向访问者本地:

Bash

$ firewall-cmd --permanen --zone=public --add-forward-port=port=22:proto=tcp:toport=22:toaddr=127.0.0.1# 配置后重载防火墙,用 ssh -p 22 root@example.com 就会访问到自己本地的 22 端口。

若要删除 forward 配置,可以:

Bash

$ firewall-cmd --permanen --zone=public --remove-forward-port=port=22:proto=tcp:toport=22:toaddr=127.0.0.1

检验修改 ssh 端口是否成功:

Bash


$ ssh -p 22 root@example.com# 无响应,因为转到了本地的 22 端口# 若防火墙未 forward 连接,则会回显 "ss
TAGS: , ,
7月 10th, 2017

让我们来假设一下,当你通过 ssh 在服务器上工作时,由于网络、电源或者是本地 PC 重启等原因会导致你的会话连接断开。

你可能会再次登录服务器继续工作也可能不会,但是你始终会留下之前没有关闭的 ssh 会话。

如何关闭一个不活动的 ssh 会话?首先使用 w 命令来识别出不活动或者是空闲的 ssh 会话,接着使用 pstree 命令来获取空闲会话的 PID,最后就是使用 kill 命令来关闭会话了。

如何识别不活动的或者是空闲的 SSH 会话

登录系统通过 w 命令来查看当前有多少用户登录着。如果你识别出了自己的会话连接就可以记下其它不活动或者是空闲的 ssh 会话去关闭。

在我当前的例子中,能看见两个用户登录着,其中一个是我当前在执行 w 命令的 ssh 会话另一个就是之前的空闲会话了。

  1. # w
  2. 10:36:39 up 26 days, 20:29, 2 users, load average: 0.00, 0.02, 0.00
  3. USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
  4. root pts/0 219.91.219.14 10:34 28.00s 0.00s 0.00s -bash
  5. root pts/2 219.91.219.14 10:36 0.00s 0.00s 0.00s w

如何获取 SSH 会话的 PID

为了关闭空闲的 ssh 会话,我们需要空闲会话进程的父进程的 PID。我们可以执行 pstree 命令来查看包括了所有进程的树状图,以便获取父进程的 pid。

你会获得与下方示例中相似的输出。pstree 命令的输出会比这个多得多,为了更好的理解我删去了许多不相关的内容。

  1. # pstree -p
  2. init(1)-+-abrtd(2131)
  3. |-acpid(1958)
  4. |-httpd(32413)-+-httpd(32442)
  5. |
  6. |-mingetty(2198)
  7. |-mysqld_safe(24298)---mysqld(24376)-+-{mysqld}(24378)
  8. |
  9. |-php(32456)-+-php(32457)
  10. |
  11. |-sshd(2023)-+-sshd(10132)---bash(10136)
  12. | `-sshd(10199)---bash(10208)---pstree(10226)
  13. |-udevd(774)-+-udevd(2191)
  14. `-udevd(27282)

从上方的输出中,你可以看到 sshd 进程与分支的树形图。sshd 的主进程是 sshd(2023),另两个分支分别为 sshd(10132)sshd(10199)

跟我在文章开始讲的相同,其中一个是我新的会话连接 sshd(10199) 它展示了我正在执行的 pstree 命令,因此空闲会话是另一个进程为 sshd(10132)

如何关闭空闲 SSH 会话

我们已经获得了有关空闲会话的所有信息。那么,就让我们来使用 kill 命令来关闭空闲会话。请确认你将下方的 PID 替换成了你服务器上的空闲会话 PID。

  1. # kill -9 10132

(LCTT 译注:这里介绍另一个工具 pkill,使用 pkill -t pts/0 -kill 就可以关闭会话, debian 8 下可用,有些版本似乎需要更改 -kill 的位置)

再次查看空闲会话是否已经被关闭

再次使用 w 命令来查看空闲会话是否已经被关闭。没错,只有那个我自己的当前会话还在,因此那个空闲会话已经被关闭了。

  1. # w
  2. 10:40:18 up 26 days, 20:33, 1 user, load average: 0.11, 0.04, 0.01
  3. USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
  4. root pts/2 219.91.219.14 10:36 0.00s 0.00s 0.00s w

再次使用 pstree 命令检查

再次使用 pstree 命令确认。是的,只有那个我自己的 ssh 会话还在。

  1. # pstree -p
  2. init(1)-+-abrtd(2131)
  3. |-acpid(1958)
  4. |
  5. |-httpd(32413)-+-httpd(32442)
  6. |
  7. |-mingetty(2198)
  8. |-mysqld_safe(24298)---mysqld(24376)-+-{mysqld}(24378)
  9. |
  10. |-php(32456)-+-php(32457)
  11. |
  12. |-sshd(2023)---sshd(10199)---bash(10208)---pstree(10431)
  13. |-udevd(774)-+-udevd(2191)
  14. `-udevd(27282)
TAGS: ,
6月 9th, 2017

ssh_scan 是一个面向 Linux 和 UNIX 服务器的易用的 SSH 服务参数配置和策略的扫描器程序,其思路来自Mozilla OpenSSH 安全指南,这个指南为 SSH 服务参数配置提供了一个可靠的安全策略基线的建议,如加密算法(Ciphers),报文认证信息码算法(MAC),密钥交换算法(KexAlgos)和其它。

ssh_scan 有如下好处:

  • 它的依赖是最小化的,ssh_scan 只引入了本地 Ruby 和 BinData 来进行它的工作,没有太多的依赖。
  • 它是可移植的,你可以在其它的项目中使用 ssh_scan 或者将它用在自动化任务上。
  • 它是易于使用的,只需要简单的将它指向一个 SSH 服务就可以获得一个该服务所支持的选项和策略状态的 JSON 格式报告。
  • 它同时也是易于配置的,你可以创建适合你策略需求的策略。

 

如何在 Linux 上安装 ssh_scan

有如下三种安装 ssh_scan 的方式:

使用 Ruby gem 来安装运行,如下:

  1. ----------- Debian/Ubuntu -----------
  2. $ sudo apt-get install rubygems
  3. $ sudo gem install ssh_scan
  4. ----------- CentOS/RHEL -----------
  5. # yum install ruby rubygems
  6. # gem install ssh_scan

使用docker 容器来运行,如下:

  1. # docker pull mozilla/ssh_scan
  2. # docker run -it mozilla/ssh_scan /app/bin/ssh_scan -t github.com

使用源码安装运行,如下:

  1. # git clone https://github.com/mozilla/ssh_scan.git
  2. # cd ssh_scan
  3. # gpg2 --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
  4. # curl -sSL https://get.rvm.io | bash -s stable
  5. # rvm install 2.3.1
  6. # rvm use 2.3.1
  7. # gem install bundler
  8. # bundle install
  9. # ./bin/ssh_scan

如何在 Linux 上使用 ssh_scan

使用 ssh_scan 的语法如下:

  1. $ ssh_scan -t ip地址
  2. $ ssh_scan -t 主机名

举个例子来扫描 192.168.43.198 这台服务器的 SSH 配置和策略,键入:

  1. $ ssh_scan -t 192.168.43.198

注意你同时也可以像下方展示的给 -t 选项传入一个[IP地址/地址段/主机名]:

  1. $ ssh_scan -t 192.168.43.198,200,205
  2. $ ssh_scan -t test.tecmint.lan

输出示例:

  1. I, [2017-05-09T10:36:17.913644 #7145] INFO -- : You're using the latest version of ssh_scan 0.0.19
  2. [
  3. {
  4. "ssh_scan_version": "0.0.19",
  5. "ip": "192.168.43.198",
  6. "port": 22,
  7. "server_banner": "SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.1",
  8. "ssh_version": 2.0,
  9. "os": "ubuntu",
  10. "os_cpe": "o:canonical:ubuntu:16.04",
  11. "ssh_lib": "openssh",
  12. "ssh_lib_cpe": "a:openssh:openssh:7.2p2",
  13. "cookie": "68b17bcca652eeaf153ed18877770a38",
  14. "key_algorithms": [
  15. "curve25519-sha256@libssh.org",
  16. "ecdh-sha2-nistp256",
  17. "ecdh-sha2-nistp384",
  18. "ecdh-sha2-nistp521",
  19. "diffie-hellman-group-exchange-sha256",
  20. "diffie-hellman-group14-sha1"
  21. ],
  22. "server_host_key_algorithms": [
  23. "ssh-rsa",
  24. "rsa-sha2-512",
  25. "rsa-sha2-256",
  26. "ecdsa-sha2-nistp256",
  27. "ssh-ed25519"
  28. ],
  29. "encryption_algorithms_client_to_server": [
  30. "chacha20-poly1305@openssh.com",
  31. "aes128-ctr",
  32. "aes192-ctr",
  33. "aes256-ctr",
  34. "aes128-gcm@openssh.com",
  35. "aes256-gcm@openssh.com"
  36. ],
  37. "encryption_algorithms_server_to_client": [
  38. "chacha20-poly1305@openssh.com",
  39. "aes128-ctr",
  40. "aes192-ctr",
  41. "aes256-ctr",
  42. "aes128-gcm@openssh.com",
  43. "aes256-gcm@openssh.com"
  44. ],
  45. "mac_algorithms_client_to_server": [
  46. "umac-64-etm@openssh.com",
  47. "umac-128-etm@openssh.com",
  48. "hmac-sha2-256-etm@openssh.com",
  49. "hmac-sha2-512-etm@openssh.com",
  50. "hmac-sha1-etm@openssh.com",
  51. "umac-64@openssh.com",
  52. "umac-128@openssh.com",
  53. "hmac-sha2-256",
  54. "hmac-sha2-512",
  55. "hmac-sha1"
  56. ],
  57. "mac_algorithms_server_to_client": [
  58. "umac-64-etm@openssh.com",
  59. "umac-128-etm@openssh.com",
  60. "hmac-sha2-256-etm@openssh.com",
  61. "hmac-sha2-512-etm@openssh.com",
  62. "hmac-sha1-etm@openssh.com",
  63. "umac-64@openssh.com",
  64. "umac-128@openssh.com",
  65. "hmac-sha2-256",
  66. "hmac-sha2-512",
  67. "hmac-sha1"
  68. ],
  69. "compression_algorithms_client_to_server": [
  70. "none",
  71. "zlib@openssh.com"
  72. ],
  73. "compression_algorithms_server_to_client": [
  74. "none",
  75. "zlib@openssh.com"
  76. ],
  77. "languages_client_to_server": [
  78. ],
  79. "languages_server_to_client": [
  80. ],
  81. "hostname": "tecmint",
  82. "auth_methods": [
  83. "publickey",
  84. "password"
  85. ],
  86. "fingerprints": {
  87. "rsa": {
  88. "known_bad": "false",
  89. "md5": "0e:d0:d7:11:f0:9b:f8:33:9c:ab:26:77:e5:66:9e:f4",
  90. "sha1": "fc:8d:d5:a1:bf:52:48:a6:7e:f9:a6:2f:af:ca:e2:f0:3a:9a:b7:fa",
  91. "sha256": "ff:00:b4:a4:40:05:19:27:7c:33:aa:db:a6:96:32:88:8e:bf:05:a1:81:c0:a4:a8:16:01:01:0b:20:37:81:11"
  92. }
  93. },
  94. "start_time": "2017-05-09 10:36:17 +0300",
  95. "end_time": "2017-05-09 10:36:18 +0300",
  96. "scan_duration_seconds": 0.221573169,
  97. "duplicate_host_key_ips": [
  98. ],
  99. "compliance": {
  100. "policy": "Mozilla Modern",
  101. "compliant": false,
  102. "recommendations": [
  103. "Remove these Key Exchange Algos: diffie-hellman-group14-sha1",
  104. "Remove these MAC Algos: umac-64-etm@openssh.com, hmac-sha1-etm@openssh.com, umac-64@openssh.com, hmac-sha1",
  105. "Remove these Authentication Methods: password"
  106. ],
  107. "references": [
  108. "https://wiki.mozilla.org/Security/Guidelines/OpenSSH"
  109. ]
  110. }
  111. }
  112. ]

你可以使用 -p 选项来指定不同的端口,-L 选项来开启日志记录配合 -V 选项来指定日志级别:

  1. $ ssh_scan -t 192.168.43.198 -p 22222 -L ssh-scan.log -V INFO

另外,可以使用 -P--policy 选项来指定一个策略文件(默认是 Mozilla Modern)(LCTT 译注:这里的 Modern 可能指的是 https://wiki.mozilla.org/Security/Server_Side_TLS 中提到的 Modern compatibility ):

  1. $ ssh_scan -t 192.168.43.198 -L ssh-scan.log -V INFO -P /path/to/custom/policy/file

ssh_scan 使用帮助与其它示例:

  1. $ ssh_scan -h

输出示例:

  1. ssh_scan v0.0.17 (https://github.com/mozilla/ssh_scan)
  2. Usage: ssh_scan [options]
  3. -t, --target [IP/Range/Hostname] IP/Ranges/Hostname to scan
  4. -f, --file [FilePath] File Path of the file containing IP/Range/Hostnames to scan
  5. -T, --timeout [seconds] Timeout per connect after which ssh_scan gives up on the host
  6. -L, --logger [Log File Path] Enable logger
  7. -O, --from_json [FilePath] File to read JSON output from
  8. -o, --output [FilePath] File to write JSON output to
  9. -p, --port [PORT] Port (Default: 22)
  10. -P, --policy [FILE] Custom policy file (Default: Mozilla Modern)
  11. --threads [NUMBER] Number of worker threads (Default: 5)
  12. --fingerprint-db [FILE] File location of fingerprint database (Default: ./fingerprints.db)
  13. --suppress-update-status Do not check for updates
  14. -u, --unit-test [FILE] Throw appropriate exit codes based on compliance status
  15. -V [STD_LOGGING_LEVEL],
  16. --verbosity
  17. -v, --version Display just version info
  18. -h, --help Show this message
  19. Examples:
  20. ssh_scan -t 192.168.1.1
  21. ssh_scan -t server.example.com
  22. ssh_scan -t ::1
  23. ssh_scan -t ::1 -T 5
  24. ssh_scan -f hosts.txt
  25. ssh_scan -o output.json
  26. ssh_scan -O output.json -o rescan_output.json
  27. ssh_scan -t 192.168.1.1 -p 22222
  28. ssh_scan -t 192.168.1.1 -p 22222 -L output.log -V INFO
  29. ssh_scan -t 192.168.1.1 -P custom_policy.yml
  30. ssh_scan -t 192.168.1.1 --unit-test -P custom_policy.yml
TAGS: ,
3月 17th, 2017

Linux下如何定制SSH来简化远程访问

SSH 使用系统全局以及用户指定(用户自定义)的配置文件。在本文中,我们将介绍如何创建一个自定义的 ssh 配置文件,并且通过特定的选项来连接到远程主机。

SSH (指 SSH 客户端)是一个用于访问远程主机的程序,它使得用户能够 在远程主机上执行命令。这是在登录远程主机中的最受推崇的方法之一,因为其设计目的就是在非安全网络环境上为两台非受信主机的通信提供安全加密。

SSH 使用系统全局以及用户指定(用户自定义)的配置文件。在本文中,我们将介绍如何创建一个自定义的 ssh 配置文件,并且通过特定的选项来连接到远程主机。

先决条件:

  1. 你必须 在你的桌面 Linux 上安装好 OpenSSH 客户端。
  2. 了解通过 ssh 进行远程连接的常用选项。

SSH 客户端配置文件

以下为 ssh 客户端配置文件:

  1. /etc/ssh/ssh_config 为默认的配置文件,属于系统全局配置文件,包含应用到所有用户的 ssh 客户端的设置。
  2. ~/.ssh/config 或者 $HOME/.ssh/config 为用户指定/自定义配置文件,这个文件中的配置只对指定的用户有效,因此,它会覆盖掉默认的系统全局配置文件中的设置。这也是我们要创建和使用的文件。

默认情况下,用户是通过在 ssh 中输入密码来获取验证的,你可以以一个简单的步骤来 使用 Keygen 来设置 ssh 无密码登录。

注:如果你的系统上不存在 ~/.ssh 目录,那就手动创建它,并设置如下权限:

  1. $ mkdir -p ~/.ssh
  2. $ chmod 0700 ~/.ssh

以上的 chmod 命令表明,只有目录属主对该目录有读取、写入和执行权限,这也是 ssh 所要求的设置。

如何创建用户指定的 SSH 配置文件

该文件并不会被默认创建的,所以你需要使用具有读取/写入权限的用户来创建它。

  1. $ touch ~/.ssh/config
  2. $ chmod 0700 ~/.ssh/config

上述文件包含由特定主机定义的各个部分,并且每个部分只应用到主机定义中相匹配的部分。

~/.ssh/config 文件的常见格式如下,其中所有的空行和以 ‘#’ 开头的行为注释:

  1. Host  host1
  2. ssh_option1=value1
  3. ssh_option2=value1 value2
  4. ssh_option3=value1
  5. Host  host2
  6. ssh_option1=value1
  7. ssh_option2=value1 value2
  8. Host  *
  9. ssh_option1=value1
  10. ssh_option2=value1 value2

如上格式详解:

  1. Host host1 为关于 host1 的头部定义,主机相关的设置就从此处开始,直到下一个头部定义 Host host2 出现,这样形成一个完整的定义。
  2. host1 和 host2 是在命令行中使用的主机别名,并非实际的远程主机名。
  3. 其中,如 sshoption1=value1、sshoption2=value1 value2 等配置选项将应用到相匹配的主机,可以缩进以看起来更整齐些。
  4. 对于 ssh_option2=value1 value2 这样的选项,ssh 执行时会按照顺序优先使用 value1 的值。
  5. 头部定义 Host * (其中 * 为匹配模式/通配符,匹配零个或多个字符) 会匹配零个或者多个主机。

仍旧以上述的格式为例,ssh 也是也这样的形式类读取配置文件的。如果你执行 ssh 命令来访问远程主机 host1,如下:

  1. $ ssh host1

以上 ssh 命令会进行一下动作:

  1. 匹配配置文件中主机别名 host1,并使用头部定义中的各个设置项。
  2. 继续匹配下一个主机定义,然后发现命令行中提供的主机名没有匹配的了,所以接下来的各个设置项会被略过。
  3. 最后执行到最后一个主机定义 Host *, 这会匹配所有的主机。这里,会将接下来的所有设置选项应用到所有的主机连接中。但是它不会覆写之前已经有主机定义的那些选项。
  4. ssh host2 与此类似。

如何使用用户指定的 shh 配置文件

在你理解了 ssh 客户端配置文件的工作方式之后,你可以通过如下方式来创建它。记得使用你的服务器环境中对应的选项、值 (主机别名、端口号、用户名等)。

通过你最喜欢的编辑器来打开配置文件:

  1. $ vi ~/.ssh/config

并定义必要的部分:

  1. Host fedora25
  2. HostName 192.168.56.15
  3. Port 22
  4. ForwardX11 no
  5. Host centos7
  6. HostName 192.168.56.10
  7. Port 22
  8. ForwardX11 no
  9. Host ubuntu
  10. HostName 192.168.56.5
  11. Port 2222
  12. ForwardX11 yes
  13. Host *
  14. User tecmint
  15. IdentityFile ~/.ssh/id_rsa
  16. Protocol 2
  17. Compression yes
  18. ServerAliveInterval 60
  19. ServerAliveCountMax 20
  20. LogLevel INFO

以上 ssh 配置文件的详细解释:

  1. HostName – 定义真正要登录的主机名,此外,你也可以使用数字 IP 地址,不管是在命令行或是 HostName 定义中都允许使用其中任一种。
  2. User – 指定以哪一个用户来登录。
  3. Port – 设置连接远程主机的端口,默认是 22 端口。但必须是远程主机的 sshd 配置文件中定义的端口号。
  4. Protocol – 这个选项定义了优先使用 ssh 支持的协议版本。常用的值为 ‘1’ 和 ‘2’,同时使用两个协议版本则必须使用英文逗号隔开。
  5. IdentityFile – 指定一个用于读取用户 DSA、Ed25519、ECDSA 等授权验证信息的文件。
  6. ForwardX11 – 定义 X11 连接是否自动重定向到安全通道和 DISPLAY 设置。有两个可以设置的值,即 yes 或 no。
  7. Compression – 默认值为 no,如果设置为 yes,则在连接远程主机过程中使用压缩进行传输。
  8. ServerAliveInterval – 设置当没有收到服务器响应 (或者数据))时的超时时间,单位为秒,ssh 会通过加密信道发送信息,请求服务器响应。默认值为 0,这意味着 ssh 不会向服务器发送响应请求;如果定义了 BatchMode 选项,则默认是 300 秒。
  9. ServerAliveCountMax – 设置服务器在没有接收到服务器的任何响应时,由服务器发送的活动信息数量。
  10. LogLevel – 定义 ssh 登录信息的的日志冗余级别。允许的值为:QUIET、FATAL、ERROR、INFO、VERBOSE、DEBUG、DEBUG1、DEBUG2 和 DEBUG3,默认为 INFO。

连接任意远程主机的标准方法是在上述两个文件中定义第二个部分(我连接的是 CentOS 7)。一般情况下,我们这样输入命令:

  1. $ ssh -i ~/.ssh/id_rsa -p 22 tecmint@192.168.56.10

然而,使用了 ssh 客户端配置文件之后,我们还可以这样:

  1. $ ssh centos7

你也可以在 man 帮助页面寻找更多的设置选项和使用实例:

  1. $man ssh_config

至此,文毕。我们在文中向你介绍了在 Linux 中如何使用用户指定 (自定义) 的 ssh 客户端配置文件。通过下方的反馈表单来写一些与本文的相关的想法吧。

TAGS: ,
9月 29th, 2016

大家有时候会发现 ssh 挂在那里没有响应了,可能是客户端的问题,也可能是服务器端的问题,也可能是客户端和服务器之间的网络问题;可能是客户端电脑休眠后连接断了、可能是网络断了、可能是 WiFi 信号不好、可能是网络延迟大了、可能是服务器挂了、也可能是服务器上的 sshd 进程挂了,…,可能是技术问题,也可能是非技术问题,可以找出无数可能。

我常遇到或者说每天都遇到的情形是,离开办公桌前忘了退出 ssh 会话。工作的时候长时间 ssh 到服务器上,工作完盖上 Mac 走人,回家后发现那些没退出的 ssh 会话还挂在那里,无法退出、无法 Ctrl+C、无法做任何操作。我的粗暴做法通常是直接关闭 Terminal 后重新开一个新的;如果用的不是图形系统,没有窗口可以关闭,那还要启用另一个终端找到相关进程后 kill 掉,如果每天都要搞这么几次还是挺烦人的。今天无意中从同事那里学到了一个小技巧,在那些没退出的 ssh 会话里用 ~. “优雅” 的断开连接。

~.

查看一下 man 帮助文件发现已经有说明,惭愧的是用了这么多年 ssh 才发现有这么一招:

$ man ssh
...
ESCAPE CHARACTERS
     ...

     The supported escapes (assuming the default `~') are:

     ~.      Disconnect.
TAGS: ,