分类 系统运维 下的文章

HHVM (HipHop Virtual Machine) 是一个用于执行以 PHP 和 Hack 语言编写的代码的虚拟环境。它是由 Facebook 开发的,提供了当前 PHP 7 的大多数功能。要在你的服务器上运行 HHVM,你需要使用 FastCGI 来将 HHVM 和 Nginx 或 Apache 衔接起来,或者你也可以使用 HHVM 中的内置 Web 服务器 Proxygen。

在这篇教程中,我将展示给你如何在 Nginx Web 服务器的 HHVM 上安装 WordPress。这里我使用 CentOS 7 作为操作系统,所以你需要懂一点 CentOS 操作的基础。

先决条件

  • CentOS 7 - 64位
  • Root 权限

步骤 1 - 配置 SELinux 并添加 EPEL 仓库

在本教程中,我们将使用 SELinux 的强制模式,所以我们需要在系统上安装一个 SELinux 管理工具。这里我们使用 setoolssetrobleshoot 来管理 SELinux 的各项配置。

CentOS 7 已经默认启用 SELinux,我们可以通过以下命令来确认:

# sestatus
# getenforce

验证 SELinux 运行状态

如图,你能够看到,SELinux 已经开启了强制模式。

接下来就是使用 yum 来安装 setoolssetroubleshoot 了。

# yum -y install setroubleshoot setools net-tools

安装好这两个后,再安装 EPEL 仓库。

# yum -y install epel-release

步骤 2 - 安装 Nginx

Nginx (发音:engine-x) 是一个高性能、低内存消耗的轻量级 Web 服务器软件。在 CentOS 中可以使用 yum 命令来安装 Nginx 包。确保你以 root 用户登录系统。

使用 yum 命令从 CentOS 仓库中安装 nginx。

# yum -y install nginx

现在可以使用 systemctl 命令来启动 Nginx,同时将其设置为跟随系统启动。

# systemctl start nginx
# systemctl enable nginx

为确保 Nginx 已经正确运行于服务器中,在浏览器上输入服务器的 IP,或者如下使用 curl 命令检查显示结果。

# curl 192.168.1.110

我这里使用浏览器来验证。

Nginx 正确运行

步骤 3 - 安装并配置 MariaDB

MariaDB 是由原 MySQL 开发者 Monty Widenius 开发的一款开源数据库软件,它由 MySQL 分支而来,与 MySQL 的主要功能保持一致。在这一步中,我们要安装 MariaDB 数据库并为之配置好 root 密码,然后再为所要安装的 WordPress 创建一个新的数据库和用户。

安装 mariadb 和 mariadb-server:

# yum -y install mariadb mariadb-server

启动 MariaDB 并添加为服务,以便随系统启动。

# systemctl start mariadb
# systemctl enable mariadb

现在 MariaDB 已经启动了,还需要为 mariadb/mysql 数据库配置 root 用户密码。输入以下命令来设置 MariaDB root 密码。

# mysql_secure_installation

提示设置 root 用户密码时,输入新密码进行设置:

Set root password? [Y/n] Y
New password:
Re-enter new password:

Remove anonymous users? [Y/n] Y
 ... Success!
Disallow root login remotely? [Y/n] Y
 ... Success!
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y
 ... Success!

这样就设置好了 MariaDB 的 root 密码。现在登录到 MariaDB/MySQL shell 并为 WordPress 的安装创建一个新数据库 wordpressdb 和新用户 wpuser,密码设置为 wpuser@。为你的设置选用一个安全的密码。

登录到 MariaDB/MySQL shell:

# mysql -u root -p

接着输入你刚刚设置的 root 用户密码。

创建数据库和用户:

MariaDB [(none)]> create database wordpressdb;
MariaDB [(none)]> create user wpuser@localhost identified by 'wpuser@';
MariaDB [(none)]> grant all privileges on wordpressdb.* to wpuser@localhost identified by 'wpuser@';
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> \q

为 WordPress 的安装创建数据库和用户

现在安装好了 MariaDB,并为 WordPress 创建好了数据库。

步骤 4 - 安装 HHVM

对于 HHVM,我们需要安装大量的依赖项。作为选择,你可以从 GitHub 下载 HHVM 的源码来编译安装,也可以从网络上获取预编译的包进行安装。在本教程中,我使用的是预编译的安装包。

为 HHVM 安装依赖项:

# yum -y install cpp gcc-c++ cmake git psmisc {binutils,boost,jemalloc,numactl}-devel \
> {ImageMagick,sqlite,tbb,bzip2,openldap,readline,elfutils-libelf,gmp,lz4,pcre}-devel \
> lib{xslt,event,yaml,vpx,png,zip,icu,mcrypt,memcached,cap,dwarf}-devel \
> {unixODBC,expat,mariadb}-devel lib{edit,curl,xml2,xslt}-devel \
> glog-devel oniguruma-devel ocaml gperf enca libjpeg-turbo-devel openssl-devel \
> mariadb mariadb-server libc-client make

然后是使用 rpm 安装从 HHVM 预编译包镜像站点 下载的 HHVM 预编译包。

# rpm -Uvh http://mirrors.linuxeye.com/hhvm-repo/7/x86_64/hhvm-3.15.2-1.el7.centos.x86_64.rpm
# ln -s /usr/local/bin/hhvm /bin/hhvm

安装好 HHVM 之后使用如下命令按了验证:

# hhvm --version

为了能使用 PHP 命令,可以把 hhvm 命令设置为 php。这样在 shell 中输入 php 命令的时候,你会看到和输入 hhvm 命令一样的结果。

# sudo update-alternatives --install /usr/bin/php php /usr/bin/hhvm 60
# php --version

安装 HHVM

步骤 5 - 配置 HHVM

这一步中,我们来配置 HHVM 以系统服务来运行。我们不通过端口这种常规的方式来运行它,而是选择使用 unix socket 文件的方式,这样运行的更快速一点。

进入 systemd 配置目录,并创建一个 hhvm.service 文件。

# cd /etc/systemd/system/
# vim hhvm.service

复制粘贴如下配置到文件中去。

[Unit]
Description=HHVM HipHop Virtual Machine (FCGI)
After=network.target nginx.service mariadb.service

[Service]
ExecStart=/usr/local/bin/hhvm --config /etc/hhvm/server.ini --user nginx --mode daemon -vServer.Type=fastcgi -vServer.FileSocket=/var/run/hhvm/hhvm.sock

[Install]
WantedBy=multi-user.target

保存文件退出 vim。

接下来,进入 hhvm 目录并编辑 server.ini 文件。

# cd /etc/hhvm/
# vim server.ini

将第 7 行 hhvm.server.port 替换为 unix socket,如下:

hhvm.server.file_socket = /var/run/hhvm/hhvm.sock

保存文件并退出编辑器。

我们已在 hhvm 服务文件中定义了 hhvm 以 nginx 用户身份运行,所以还需要把 socket 文件目录的属主变更为 nginx。然后我们还必须在 SELinux 中修改 hhvm 目录的权限上下文以便让它可以访问这个 socket 文件。

# chown -R nginx:nginx /var/run/hhvm/
# semanage fcontext -a -t httpd_var_run_t "/var/run/hhvm(/.*)?"
# restorecon -Rv /var/run/hhvm

服务器重启之后,hhvm 将不能运行,因为没有存储 socket 文件的目录,所有还必须在启动的时候自动创建一个。

使用 vim 编辑 rc.local 文件。

# vim /etc/rc.local

将以下配置粘贴到文件末行。

# mkdir -p /var/run/hhvm/
# chown -R nginx:nginx /var/run/hhvm/
# semanage fcontext -a -t httpd_var_run_t "/var/run/hhvm(/.*)?"
# restorecon -Rv /var/run/hhvm

保存文件并退出 vim。然后给文件赋予执行权限。

# chmod +x /etc/rc.local

重新加载 systemd 服务,启动 hhvm 并设置为随系统启动。

# systemctl daemon-reload
# systemctl start hhvm
# systemctl enable hhvm

要确保无误,使用 netstat 命令验证 hhvm 运行于 socket 文件。

# netstat -pl | grep hhvm

Check the HHVM socket file

步骤 6 - 配置 HHVM 和 Nginx

在这个步骤中,我们将配置 HHVM 已让它运行在 Nginx Web 服务中,这需要在 Nginx 目录创建一个 hhvm 的配置文件。

进入 /etc/nginx 目录,创建 hhvm.conf 文件。

# cd /etc/nginx/
# vim hhvm.conf

粘贴以下内容到文件中。

location ~ \.(hh|php)$ {
    root /usr/share/nginx/html;
    fastcgi_keep_conn on;
    fastcgi_pass unix:/var/run/hhvm/hhvm.sock;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

然后,保存并退出。

接下来,编辑 nginx.conf 文件,添加 hhvm 配置文件到 include 行。

# vim nginx.conf

添加配置到第 57 行的 server 指令中。

include /etc/nginx/hhvm.conf;

保存并退出。

然后修改 SELinux 中关于 hhvm 配置文件的权限上下文。

# semanage fcontext -a -t httpd_config_t /etc/nginx/hhvm.conf
# restorecon -v /etc/nginx/hhvm.conf

测试 Nginx 配置并重启服务。

# nginx -t
# systemctl restart nginx

记住确保测试配置没有错误。

步骤 7 - 通过 HHVM 和 Nginx 创建虚拟主机

在这一步中,我们要为 Nginx 和 hhvm 创建一个新的虚拟主机配置文件。这里我使用域名 natsume.co 来作为例子,你可以使用你主机喜欢的域名,并在配置文件中相应位置以及 WordPress 安装过程中进行替换。

进入 nginx 的 conf.d 目录,我们将在该目录存储虚拟主机文件。

# cd /etc/nginx/conf.d/

使用 vim 创建一个名为 natsume.conf 的配置文件。

# vim natsume.conf

粘贴以下内容到虚拟主机配置文件中。

server {
    listen       80;
    server_name  natsume.co;

    # note that these lines are originally from the "location /" block
    root   /var/www/hakase;
    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }
    error_page 404 /404.html;
    location = /50x.html {
        root /var/www/hakase;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass unix:/var/run/hhvm/hhvm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

保存并退出。

在这个虚拟主机配置文件中,我们定义该域名的 Web 根目录为 /var/www/hakase。目前该目录还不存在,所有我们要创建它,并变更属主为 nginx 用户和组。

# mkdir -p /var/www/hakase
# chown -R nginx:nginx /var/www/hakase

接下来,为该文件和目录配置 SELinux 上下文。

# semanage fcontext -a -t httpd_config_t "/etc/nginx/conf.d(/.*)?"
# restorecon -Rv /etc/nginx/conf.d

最后,测试 nginx 配置文件以确保没有错误后,重启 nginx:

# nginx -t
# systemctl restart nginx

步骤 8 - 安装 WordPress

在步骤 5 的时候,我们已经为 WordPress 配置好了虚拟主机,现在只需要下载 WordPress 和使用我们在步骤 3 的时候创建的数据库和用户来编辑数据库配置就好了。

进入 Web 根目录 /var/www/hakase 并使用 Wget 命令下载 WordPress:

# cd /var/www/hakase
# wget wordpress.org/latest.tar.gz

解压 latest.tar.gz 并将 wordpress 文件夹中所有的文件和目录移动到当前目录:

# tar -xzvf latest.tar.gz
# mv wordpress/* .

下一步,复制一份 wp-config-sample.php 并更名为 wp-config.php,然后使用 vim 进行编辑:

# cp wp-config-sample.php wp-config.php
# vim wp-config.php

DB_NAME 设置为 wordpressdbDB_USER 设置为 wpuser 以及 DB_PASSWORD 设置为 wpuser@

define('DB_NAME', 'wordpressdb');
define('DB_USER', 'wpuser');
define('DB_PASSWORD', 'wpuser@');
define('DB_HOST', 'localhost');

保存并退出。

WordPress 配置

修改关于 WordPress 目录的 SELinux 上下文。

# semanage fcontext -a -t httpd_sys_content_t "/var/www/hakase(/.*)?"
# restorecon -Rv /var/www/hakase

现在打开 Web 浏览器,在地址栏输入你之前为 WordPress 设置的域名,我这里是 natsume.co

选择语言并点击 继续 Continue

安装 Wordpress - 语言选择

根据自身要求填写站点标题和描述并点击 安装 Wordpress Install Wordpress "。

安装 Wordpress - 配置管理员账号和站点标题

耐心等待安装完成。你会见到如下页面,点击 登录 Log In 来登录到管理面板。

安装 Wordpress - 成功安装

输入你设置的管理员用户账号和密码,在此点击 登录 Log In

登录到 wordpress 管理面板

现在你已经登录到 WordPress 的管理面板了。

Wordpress 管理面

Wordpress 的主页:

Wordpress 默认主页

至此,我们已经在 CentOS 7 上通过 Nginx 和 HHVM 成功安装 Wordpress。

参考链接


译者简介:

GHLandy —— 划不完粉腮柳眉泣别离。


via: https://www.howtoforge.com/tutorial/how-to-install-wordpress-with-hhvm-and-nginx-on-centos-7/

作者:Muhammad Arul 译者:GHLandy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

本文讲述了如何通过 Linux中国 所开发的微信小程序“运维密码”实现在 Linux 系统上 OpenSSH 双因子认证,从而对 SSH 进行安全加固。

背景

近来很多知名企业都出现了密码泄露,通过单一的密码对敏感和重要信息进行保护已经面临越来越多的挑战,因此业内对多重认证的呼声也越来越高,而其中的双因子认证得到了业界的普遍认可。

什么是双因子认证

双因子认证 Two-factor authentication (即 2FA),是一种通过组合两种不同的验证方式进行用户身份验证的机制。

在这种多重认证的系统中,用户需要通过两种不同的认证程序:

  • 提供他们知道的信息(如用户名/密码)
  • 再借助其他工具提供用户所不知道的信息(如用手机生成的一次性密码)

SSH 双因子认证实现思路

在 SSH 服务器端安装 Google 身份验证器服务器端组件,这样,在使用密码或密钥登录 SSH 服务器时,同时通过与 Google 身份验证器相匹配的客户端所提供的验证信息来确认登录者的身份和权限。这里的客户端可以使用 Google 身份验证器 Google Authenticator 应用,也可以使用我们开发的、采用同一个 RFC 规范的“运维密码”微信小程序。

Google 身份验证器所采用的算法规范基于 TOTP RFC 草案

(题外话,RSA 硬件令牌,也是采用了类似的机制,只不过客户端是硬件的;而最近 Apple 公司的一些服务所需要的双因子认证也是一样的,但是其用于呈现验证信息的是手机或平板上的 iOS 内部组件,非独立应用。)

关于Google 身份验证器

为了鼓励广泛采用双因子认证的方式,Google 公司发布了 Google 身份验证器 Google Authenticator ,这是一款开源的、可基于开放规则(如 HMAP/ 基于时间)生成一次性密码的软件。它是一款跨平台软件,可运行在 Linux、Android、iOS 上。Google 公司同时也支持 插件式鉴别模块 pluggable authentication module PAM ,使其能和其它适用于 PAM 进行验证的工具(如 OpenSSH)协同工作。

Google 身份验证器分为两个部分,分别是服务器端组件和客户端应用,都称之为“Google 身份验证器”,这里,我们为了澄清起见,会在说明时指明。

关于运维密码

Google 公司所开发的身份验证器以简洁著称,但也因此缺乏一些必要的特性,比如备份功能——这使得使用该身份验证器的人时时处于手机丢失的恐慌之中。(虽然 Google 提供的服务器端和自身的服务也提供了紧急验证码,以用于这种情况下的自救,但是很多采用 Google 身份验证器的服务并不支持和提供紧急验证码)

作为一家紧密关注于运维安全、积极倡导信息安全的技术社区,Linux 中国 久已有开发一个新的替代品的想法。恰逢微信推出小程序平台,我们感觉到这正是一个良机,可以充分利用到微信和小程序的便利之处,又适合小程序的使用情境。因此,由 Linux 中国旗下的 LCTT 技术组的白宦成同学独立开发了一款旨在移动互联网场景中提供更好的多因子认证体验的小程序:运维密码

顺便说一句,在产品初步成熟之后,我们已经将该小程序开源给社区,代码托管于 GitHub:https://github.com/LCTT/WeApp-Password ,希望更多的人能够受益和共同完善它,有什么功能需求、错误反馈请到 GitHub 上提出 issue,也欢迎发送拉取请求给我们。

此外,大家在使用过程中,发现什么问题或需要帮助,也可以加入微信体验群:

扫描识别添加上面的好友,验证信息:“运维密码”,可获得入群邀请。

言归正传,我们来看看如何使用“运维密码”来为你的 SSH 服务提供双因子认证支持。

如何开始

首先我们需要一些准备工作:

  • 一台运行着 OpenSSH 服务(版本大于 6.2)的 Linux 主机
  • 一台能运行微信的智能手机
  • 一台支持 SSH 登录的终端

在 Linux 系统中安装 Google 身份验证器服务器端组件

第一步需要在运行着 OpenSSH 服务的 Linux 主机上安装 Google 身份验证器服务器端组件。按照如下步骤安装 Google 身份验证器及其 PAM 模块。

用安装包安装 Google 身份验证器服务器端组件

如果你不想自己构建 Google 身份验证器服务器端组件,在几个主流 Linux 发行版上有已经编译好的安装包。安装包里面包含 Google 身份验证器服务器端组件的二进制程序和 PAM 模块。

在 Ubuntu 上安装 Google 身份验证器服务器端组件:

sudo apt-get install libpam-google-authenticator

在 Fedora 上安装 Google 身份验证器服务器端组件:

sudo dnf install google-authenticator

在 CentOS 上安装 Google 身份验证器服务器端组件,需要首先启用 EPEL 软件库,然后运行如下命令:

sudo yum install google-authenticator

编译安装 Google 身份验证器服务器端组件

提示:编译安装建议对 Linux、pam 等熟悉的同学采用。

首先,安装构建 Google 身份验证器所需的软件包。

在 Debian、 Ubuntu 或 Linux Mint 上:

sudo apt-get install wget make gcc libpam0g-dev

在 CentOS、 Fedora 或 RHEL 上:

sudo yum install wget make gcc pam-devel

然后下载 Google 身份验证器服务器端组件的源代码:

git clone https://github.com/google/google-authenticator-libpam.git

编译安装 Google 身份验证器服务器端组件:

cd google-authenticator-libpam

./bootstrap.sh
./configure

make

如果构建成功,你会在目录中看到 pam_google_authenticator.sogoogle-authenticator 两个二进制文件。

最后,将 Google 身份验证器的服务器端组件安装到合适位置。其默认会安装到 /usr/local/lib/security 下,根据你的系统不同,你可能需要将其符号链接到 pam 库的位置(比如 CentOS 7 会在 /usr/lib64/security)。如下图所示:

sudo make install

至此,Google 身份验证器服务器端组件安装完成。

配置 Google 身份验证器服务器端组件及“运维密码”小程序

完成 Google 身份验证器服务器端组件的安装我们仅仅完成了第一步,接着需要对 Google 身份验证器服务器端组件、“运维密码”、OpenSSH 进行配置才能达到我们预期的效果。

配置 google-authenticator 及生成验证密钥

使用以下命令生成验证密钥:

./google-authenticator 

生成验证密钥的时候,会再次确认信息。

Do you want authentication tokens to be time-based (y/n)

意思是:你想要生成基于时间生成验证码吗?这里需要需要输入 y

输入 y之后你将看到一个代表着该“场景”密钥的二维码和密钥字符串,它使用如下二维码图形格式表示我们数字形态的密钥(这里也提供了一个用于在浏览器中再次显示该二维码的 URL,但是需要翻墙)。接着我们要用到它在“运维密码”上完成配置。(安装 google-authenticator 过程中若出现二维码无法显示的问题,请检查系统中是否安装了二维码生成器:rpm - q qrencode,若未安装,请运行命令 yum install qrencode -y 安装后重试。)

在二维码和密钥字符串后面,接着显示了一个当前的校验码和几个紧急密钥。紧急密钥你可以另行保存的一个安全的地方,以防你在无法使用 Google 身份验证器应用或“运维密码”时使用(紧急密钥是 8 位的,不同于普通的 6 位密钥,也是一次性使用的)。

保存 Google 服务器端组件的配置文件,Google 身份验证器虽然运行了,但是相关设置还没有保存,接下来会提示保存:

Do you want me to update your "/root/.google_authenticator" file? (y/n) 

意思是:你想将配置文件更新到 /root/.google_authenticator 保存吗?

输入 y 回车。

禁止同一令牌多次登录

Do you want to disallow multiple uses of the same authentication
token? This restricts you to one login about every 30s, but it increases
your chances to notice or even prevent man-in-the-middle attacks (y/n)

意思是:你是否要禁用同一密钥多次登录,这将限制你每 30 秒只能使用该密钥登录一次,但这能够让你可以更多地被提醒受到了中间人攻击,甚至能够防止这种攻击。

输入 y 回车。

时间容错设置

By default, tokens are good for 30 seconds. In order to compensate for
possible time-skew between the client and the server, we allow an extra
token before and after the current time. If you experience problems with
poor time synchronization, you can increase the window from its default
size of +-1min (window size of 3) to about +-4min (window size of
17 acceptable tokens).

Do you want to do so? (y/n) 

意思是:默认情况下,密钥在 30 秒内有效,为了防止由于客户端与服务器时间偏移(时间相差太大)导致认证失败,google 身份验证器设计了时间容错措施。可以让你使用与当前时间偏移 1 到 4 分钟的密钥。

这个可根据实际情况进行配置,一般一分钟就足够了。

输入 y回车。

暴力破解防护

If the computer that you are logging into isn't hardened against brute-force
login attempts, you can enable rate-limiting for the authentication module.
By default, this limits attackers to no more than 3 login attempts every 30s.

Do you want to enable rate-limiting (y/n) 

意思是:为了避免暴力破解,可以启用速率限制,默认情况下,每 30 秒只能尝试 3 次。

输入 y回车。

配置完成

配置完成后会在home目录下生成一个权限为 400 的隐藏文件,如下图所示:

配置运维密码

打开微信小程序

打开微信,依次点击“发现”,“小程序”,输入“运维密码”并搜索。或长按识别下列二维码:

点击“运维密码”进入应用,然后点击列表下方的“添加场景”:

 title=

这会调起“扫一扫”功能,请扫描配置 google-authenticator 时所生成的二维码,然后会识别出该场景信息,你可以根据需要修改场景信息,点击确定添加场景。

这样 Google 身份验证器就和“运维密码”匹配上了。下面我们要使 SSH 服务可以支持该验证。

配置 SSH 服务

添加认证模块

使用如下命令在 /etc/pam.d/sshd 文件添加认证模块:

echo "auth required pam_google_authenticator.so" >>/etc/pam.d/sshd

在 Centos 6.6 或更低的版本中如果遇到无法进行 google-authenticator 验证的情况,请将 auth required pam_google_authenticator.so放在 /etc/pam.d/sshd 文件的最顶端进行测试一下。

配置挑战式密码认证:

sed -i 's/ChallengeResponseAuthentication no/ChallengeResponseAuthentication yes/g' /etc/ssh/sshd_config

重启 sshd 服务:

systemctl restart sshd.service

切记,如果你是远程登录到服务器上配置,切勿退出当前的 SSH 会话,而应该另外开一个会话去测试 SSH 登录。重启不会中断当前的 SSH 会话。

测试登录

以上配置完成基本上就搞定了,下面我们进行测试。

密码登录测试

另外开一个终端窗口进行连接,不要关闭当前的 SSH 连接。

输入命令登录主机:

ssh [email protected]

首先输入服务器的密码,接着会让输入“运维密码”生成的 6 位数字密钥。

 title=

如下图:

我们可以看到,在登录的时候,需要配合“运维密码”才能登录服务器。

公钥登录测试

如果使用公钥登录呢?以上配置是不是也是需要配合“运维密码”才能登录的,我们进行验证一下:

首先,我们将本机的公钥复制到远程机器的 authorized_keys 文件中。

ssh-copy-id [email protected]

登录测试:

我们可以看到,不需要输入任何密码和一次性密钥,直接登录到了系统。

结合运维密码配置增强型SSH安全选项

针对上面公钥登录的测试,如果认为还不是很安全,我们可以设定如下登录场景:公钥 + 密码 + 运维密码,我们需要如何做呢?

配置 SSH 公钥双因子

修改 /etc/ssh/sshd_config 配置文件:

echo "AuthenticationMethods publickey,keyboard-interactive:pam" >>/etc/ssh/sshd_config

重启 SSH 服务:

systemctl restart sshd.service

登录测试(同样,请新开窗口):

ssh [email protected]

可以看到,登录的时候是需要验证公钥、密码,及输入“运维密码”生成的密钥才能登录到系统。

没有密钥的情况下尝试登录测试,如下图:

总结

至此,本文结束,更多的使用细节可以参照小程序内的帮助,或此文

如有错误及不足欢迎指正。也欢迎大家加入到这个小程序的开发当中,将这个小程序应用到你的应用场景中。

动态主机配置协议(DHCP) 是一种用于使主机能够从服务器自动分配 IP 地址和相关的网络配置的网络协议。

DHCP 服务器分配给 DHCP 客户端的 IP 地址处于“租用”状态,租用时间通常取决于客户端计算机要求连接的时间或 DHCP 服务器配置的时间。

DHCP 如何工作?

以下是 DHCP 实际工作原理的简要说明:

  • 一旦客户端(配置为使用 DHCP 的机器)连接到网络后,它会向 DHCP 服务器发送 DHCPDISCOVER 数据包。
  • 当 DHCP 服务器收到 DHCPDISCOVER 请求报文后会使用 DHCPOFFER 包进行回复。
  • 然后客户端获取到 DHCPOFFER 数据包,并向服务器发送一个 DHCPREQUEST 包,表示它已准备好接收 DHCPOFFER 包中提供的网络配置信息。
  • 最后,DHCP 服务器从客户端收到 DHCPREQUEST 报文后,发送 DHCPACK 报文,表示现在允许客户端使用分配给它的 IP 地址。

在本文中,我们将介绍如何在 Ubuntu/Debian Linux 中设置 DHCP 服务器,我们将使用 sudo 命令来运行所有命令,以获得 root 用户权限。

测试环境设置

在这步中我们会使用如下的测试环境。

  • DHCP Server - Ubuntu 16.04
  • DHCP Clients - CentOS 7 and Fedora 25

步骤 1:在 Ubuntu 中安装 DHCP 服务器

1、 运行下面的命令来安装 DHCP 服务器包,也就是 dhcp3-server

$ sudo apt install isc-dhcp-server

2、 安装完成后,编辑 /etc/default/isc-dhcp-server 使用 INTERFACES 选项定义 DHCPD 响应 DHCP 请求所使用的接口。

比如,如果你想让 DHCPD 守护进程监听 eth0,按如下设置:

INTERFACES="eth0"

同样记得为上面的接口配置静态地址

步骤 2:在 Ubuntu 中配置 DHCP 服务器

3、 DHCP 配置的主文件是 /etc/dhcp/dhcpd.conf, 你必须填写会发送到客户端的所有网络信息。

并且 DHCP 配置中定义了两种不同的声明,它们是:

  • parameters - 指定如何执行任务、是否执行任务,还有指定要发送给 DHCP 客户端的网络配置选项。
  • declarations - 定义网络拓扑、指定客户端、为客户端提供地址,或将一组参数应用于一组声明。

4、 现在打开并修改主文件,定义 DHCP 服务器选项:

$ sudo vi /etc/dhcp/dhcpd.conf 

在文件顶部设置以下全局参数,它们将应用于下面的所有声明(请指定适用于你情况的值):

option domain-name "tecmint.lan";
option domain-name-servers ns1.tecmint.lan, ns2.tecmint.lan;
default-lease-time 3600; 
max-lease-time 7200;
authoritative;

5、 现在定义一个子网,这里我们为 192.168.10.0/24 局域网设置 DHCP (请使用适用你情况的参数):

subnet 192.168.10.0 netmask 255.255.255.0 {
  option routers                  192.168.10.1;
  option subnet-mask              255.255.255.0;
  option domain-search            "tecmint.lan";
  option domain-name-servers      192.168.10.1;
  range   192.168.10.10   192.168.10.100;
  range   192.168.10.110   192.168.10.200;
}

步骤 3:在 DHCP 客户端上配置静态地址

6、 要给特定的客户机分配一个固定的(静态)的 IP,你需要显式将这台机器的 MAC 地址以及静态分配的地址添加到下面这部分。

host centos-node {
  hardware ethernet 00:f0:m4:6y:89:0g;
  fixed-address 192.168.10.105;
}
host fedora-node {
  hardware ethernet 00:4g:8h:13:8h:3a;
  fixed-address 192.168.10.106;
}

保存并关闭文件。

7、 接下来,启动 DHCP 服务,并让它下次开机自启动,如下所示:

------------ SystemD ------------ 
$ sudo systemctl start isc-dhcp-server.service
$ sudo systemctl enable isc-dhcp-server.service
------------ SysVinit ------------ 
$ sudo service isc-dhcp-server.service start
$ sudo service isc-dhcp-server.service enable

8、 接下来不要忘记允许 DHCP 服务(DHCP 守护进程监听 67 UDP 端口)的防火墙权限:

$ sudo ufw allow  67/udp
$ sudo ufw reload
$ sudo ufw show

步骤 4:配置 DHCP 客户端

9、 此时,你可以将客户端计算机配置为自动从 DHCP 服务器接收 IP 地址。

登录到客户端并编辑以太网接口的配置文件(注意接口名称/号码):

$ sudo vi /etc/network/interfaces

定义如下选项:

auto  eth0
iface eth0 inet dhcp

保存文件并退出。重启网络服务(或重启系统):

------------ SystemD ------------ 
$ sudo systemctl restart networking
------------ SysVinit ------------ 
$ sudo service networking restart

另外你也可以使用 GUI 来在进行设置,如截图所示(在 Fedora 25 桌面中)设置将方式设为自动(DHCP)。

Set DHCP Network in Fedora

在 Fedora 中设置 DHCP 网络

此时,如果所有设置完成了,你的客户端应该可以自动从 DHCP 服务器接收 IP 地址了。

就是这样了!在本篇教程中,我们向你展示了如何在 Ubuntu/Debian 设置 DHCP 服务器。在反馈栏中分享你的想法。如果你正在使用基于 Fedora 的发行版,请阅读如何在 CentOS/RHEL 中设置 DHCP 服务器。


作者简介:

Aaron Kili 是 Linux 和 F.O.S.S 爱好者,将来的 Linux SysAdmin 和 web 开发人员,目前是 TecMint 的内容创建者,他喜欢用电脑工作,并坚信分享知识。


via: http://www.tecmint.com/install-dhcp-server-in-ubuntu-debian/

作者:Aaron Kili 译者:geekpi 校对:jasminepeng

本文由 LCTT 原创编译,Linux中国 荣誉推出

我们之前在 NMAP 的安装一文中,列出了 10 种不同的 ZeNMAP 扫描模式。大多数的模式使用了各种参数。各种参数代表了执行不同的扫描模式。这篇文章将介绍其中的四种通用的扫描类型。

四种通用扫描类型

下面列出了最常使用的四种扫描类型:

  1. PING 扫描 (-sP)
  2. TCP SYN 扫描 (-sS)
  3. TCP Connect() 扫描 (-sT)
  4. UDP 扫描 (-sU)

当我们利用 NMAP 来执行扫描的时候,这四种扫描类型是我们需要熟练掌握的。更重要的是需要知道这些命令做了什么并且需要知道这些命令是怎么做的。本文将介绍 PING 扫描和 UDP 扫描。在之后的文中会介绍 TCP 扫描。

PING 扫描 (-sP)

某些扫描会造成网络拥塞,然而 Ping 扫描在网络中最多只会产生两个包。当然这两个包不包括可能需要的 DNS 搜索和 ARP 请求。每个被扫描的 IP 最少只需要一个包来完成 Ping 扫描。

通常 Ping 扫描是用来查看在指定的 IP 地址上是否有在线的主机存在。例如,当我拥有网络连接却连不上一台指定的网络服务器的时候,我就可以使用 PING 来判断这台服务器是否在线。PING 同样也可以用来验证我的当前设备与网络服务器之间的路由是否正常。

注意: 当我们讨论 TCP/IP 的时候,相关信息在使用 TCP/IP 协议的互联网与局域网(LAN)中都是相当有用的。这些程序都能工作。同样在广域网(WAN)也能工作得相当好。

当参数给出的是一个域名的时候,我们就需要域名解析服务来找到相对应的 IP 地址,这个时候将会生成一些额外的包。例如,当我们执行 ping linuxforum.com 的时候,需要首先请求域名(linuxforum.com)的 IP 地址(98.124.199.63)。当我们执行 ping 98.124.199.63 的时候 DNS 查询就不需要了。当 MAC 地址未知的时候,就需要发送 ARP 请求来获取指定 IP 地址的 MAC 地址了(LCTT 译注:这里的指定 IP 地址,未必是目的 IP)。

Ping 命令会向指定的 IP 地址发送一个英特网信息控制协议(ICMP)包。这个包是需要响应的 ICMP Echo 请求。当服务器系统在线的状态下我们会得到一个响应包。当两个系统之间存在防火墙的时候,PING 请求包可能会被防火墙丢弃。一些服务器也会被配置成不响应 PING 请求来避免可能发生的死亡之 PING。(LCTT 译注:现在的操作系统似乎不太可能)

注意: 死亡之 PING 是一种恶意构造的 PING 包当它被发送到系统的时候,会造成被打开的连接等待一个 rest 包。一旦有一堆这样的恶意请求被系统响应,由于所有的可用连接都已经被打开,所以系统将会拒绝所有其它的连接。技术上来说这种状态下的系统就是不可达的。

当系统收到 ICMP Echo 请求后它将会返回一个 ICMP Echo 响应。当源系统收到 ICMP Echo 响应后我们就能知道目的系统是在线可达的。

使用 NMAP 的时候你可以指定单个 IP 地址也可以指定某个 IP 地址段。当被指定为 PING 扫描(-sP)的时候,会对每一个 IP 地址执行 PING 命令。

在图 1 中你可以看到我执行 nmap -sP 10.0.0.1-10 命令后的结果。程序会试着联系 IP 地址 10.0.0.1 到 10.0.0.10 之间的每个系统。对每个 IP 地址都要发出三个 ARP 请求。在我们的例子中发出了三十个请求,这 10 个 IP 地址里面有两个有回应。(LCTT 译注:此处原文存疑。)

Figure 01

图 1

图 2 中展示了网络上另一台计算机利用 Wireshark 抓取的发出的请求——没错,是在 Windows 系统下完成这次抓取的。第一行展示了发出的第一条请求,广播请求的是 IP 地址 10.0.0.2 对应 MAC 地址。由于 NMAP 是在 10.0.0.1 这台机器上执行的,因此 10.0.0.1 被略过了。由于本机 IP 地址被略过,我们现在可以看到总共只发出了 27 个 ARP 请求。第二行展示了 10.0.0.2 这台机器的 ARP 响应。第三行到第十行是其它八个 IP 地址的 ARP 请求。第十一行是由于 10.0.0.2 没有收到请求系统(10.0.0.1)的反馈所以(重新)发送的另一个 ARP 响应。第十二行是源系统向 10.0.0.2 发起的 HTTP 连接的 ‘SYN’ 和 Sequence 0。第十三行和第十四行的两次 Restart(RST)和 Synchronize(SYN)响应是用来关闭(和重发)第十二行所打开的连接的。注意 Sequence ID 是 ‘1’ - 是源 Sequence ID + 1。第十五行开始就是类似相同的内容。(LCTT 译注:此处原文有误,根据情况已经修改。)

Figure 02.jpg

图 2

回到图 1 中我们可以看到有两台主机在线。其中一台是本机(10.0.0.1)另一台是(10.0.0.2)。整个扫描花费了 14.40 秒。

PING 扫描是一种用来发现在线主机的快速扫描方式。扫描结果中没有关于网络、系统的其它信息。这是一种较好的初步发现网络上在线主机的方式,接着你就可以针对在线系统执行更加复杂的扫描了。你可能还会发现一些不应该出现在网络上的系统。出现在网络上的流氓软件是很危险的,他们可以很轻易的收集内网信息和相关的系统信息。

一旦你获得了在线系统的列表,你就可以使用 UDP 扫描来查看哪些端口是可能开启了的。

UDP 扫描 (-sU)

现在你已经知道了有那些系统是在线的,你的扫描就可以聚焦在这些 IP 地址之上。在整个网络上执行大量的没有针对性的扫描活动可不是一个好主意,系统管理员可以使用程序来监控网络流量当有大量异常活动发生的时候就会触发警报。

用户数据报协议(UDP)在发现在线系统的开放端口方面十分有用。由于 UDP 不是一个面向连接的协议,因此是不需要响应的。这种扫描方式可以向指定的端口发送一个 UDP 包。如果目标系统没有回应那么这个端口可能是关闭的也可能是被过滤了的。如果端口是开放状态的那么应该会有一个响应。在大多数的情况下目标系统会返回一个 ICMP 信息说端口不可达。ICMP 信息让 NMAP 知道端口是被关闭了。如果端口是开启的状态那么目标系统应该响应 ICMP 信息来告知 NMAP 端口可达。

注意: 只有最前面的 1024 个常用端口会被扫描。(LCTT 译注:这里将 1000 改成了1024,因为手册中写的是默认扫描 1 到 1024 端口)在后面的文章中我们会介绍如何进行深度扫描。

由于我知道 10.0.0.2 这个主机是在线的,因此我只会针对这个 IP 地址来执行扫描。扫描过程中总共收发了 3278 个包。sudo nmap -sU 10.0.0.2 这个命令的输出结果在图 3 中展现。

Figure 03.jpg

图 3

在这副图中你可以看见端口 137(netbios-ns)被发现是开放的。在图 4 中展示了 Wireshark 抓包的结果。不能看到所有抓取的包,但是可以看到一长串的 UDP 包。

Figure 4.jpg

图 4

如果我把目标系统上的防火墙关闭之后会发生什么呢?我的结果有那么一点的不同。NMAP 命令的执行结果在图 5 中展示。

Figure 05.png

图 5

注意: 当你执行 UDP 扫描的时候是需要 root 权限的。

会产生大量的包是由于我们使用了 UDP。当 NMAP 发送 UDP 请求时它是不保证数据包会被收到的。因为数据包可能会在中途丢失因此它会多次发送请求。


via: https://www.linuxforum.com/threads/nmap-common-scans-part-one.3637/

作者:Jarret 译者:wcnnbdk1 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

 title=

在这个系列中, 我们会讨论一些阻止黑客入侵你的系统的重要信息。观看这个免费的网络点播研讨会获取更多的信息。

在这个系列的第一部分中,我分享过两种简单的方法来阻止黑客黑掉你的 Linux 主机。这里是另外三条来自于我最近在 Linux 基金会的网络研讨会上的建议,在这次研讨会中,我分享了更多的黑客用来入侵你的主机的策略、工具和方法。完整的网络点播研讨会视频可以在网上免费观看。

简单的 Linux 安全提示 #3

Sudo。

Sudo 非常、非常的重要。我认为这只是很基本的东西,但就是这些基本的东西会让我的黑客生涯会变得更困难一些。如果你没有配置 sudo,还请配置好它。

还有,你主机上所有的用户必须使用他们自己的密码。不要都免密码使用 sudo 执行所有命令。当我有一个可以无需密码而可以 sudo 任何命令的用户,只会让我的黑客活动变得更容易。如果我可以无需验证就可以 sudo ,同时当我获得你的没有密码的 SSH 密钥后,我就能十分容易的开始任何黑客活动。这样,我就拥有了你机器的 root 权限。

保持较低的超时时间。我们喜欢劫持用户的会话,如果你的某个用户能够使用 sudo,并且设置的超时时间是 3 小时,当我劫持了你的会话,那么你就再次给了我一个自由的通道,哪怕你需要一个密码。

我推荐的超时时间大约为 10 分钟,甚至是 5 分钟。用户们将需要反复地输入他们的密码,但是,如果你设置了较低的超时时间,你将减少你的受攻击面。

还要限制可以访问的命令,并禁止通过 sudo 来访问 shell。大多数 Linux 发行版目前默认允许你使用 sudo bash 来获取一个 root 身份的 shell,当你需要做大量的系统管理的任务时,这种机制是非常好的。然而,应该对大多数用户实际需要运行的命令有一个限制。你对他们限制越多,你主机的受攻击面就越小。如果你允许我 shell 访问,我将能够做任何类型的事情。

简单的 Linux 安全提示 #4

限制正在运行的服务。

防火墙很好,你的边界防火墙非常的强大。当流量流经你的外部网络时,有几家防火墙产品可以帮你很好的保护好自己。但是防火墙内的人呢?

你正在使用基于主机的防火墙或者基于主机的入侵检测系统吗?如果是,请正确配置好它。怎样可以知道你的正在受到保护的东西是否出了问题呢?

答案是限制当前正在运行的服务。不要在不需要提供 MySQL 服务的机器上运行它。如果你有一个默认会安装完整的 LAMP 套件的 Linux 发行版,而你不会在它上面运行任何东西,那么卸载它。禁止那些服务,不要开启它们。

同时确保用户不要使用默认的身份凭证,确保那些内容已被安全地配置。如何你正在运行 Tomcat,你不应该可以上传你自己的小程序(applets)。确保它们不会以 root 的身份运行。如果我能够运行一个小程序,我不会想着以管理员的身份来运行它,我能访问就行。你对人们能够做的事情限制越多,你的机器就将越安全。

简单的 Linux 安全提示 #5

小心你的日志记录。

看看它们,认真地,小心你的日志记录。六个月前,我们遇到一个问题。我们的一个顾客从来不去看日志记录,尽管他们已经拥有了很久、很久的日志记录。假如他们曾经看过日志记录,他们就会发现他们的机器早就已经被入侵了,并且他们的整个网络都是对外开放的。我在家里处理的这个问题。每天早上起来,我都有一个习惯,我会检查我的 email,我会浏览我的日志记录。这仅会花费我 15 分钟,但是它却能告诉我很多关于什么正在发生的信息。

就在这个早上,机房里的三台电脑死机了,我不得不去重启它们。我不知道为什么会出现这样的情况,但是我可以从日志记录里面查出什么出了问题。它们是实验室的机器,我并不在意它们,但是有人会在意。

通过 Syslog、Splunk 或者任何其他日志整合工具将你的日志进行集中是极佳的选择。这比将日志保存在本地要好。我最喜欢做是事情就是修改你的日志记录让你不知道我曾经入侵过你的电脑。如果我能这么做,你将不会有任何线索。对我来说,修改集中的日志记录比修改本地的日志更难。

它们就像你的很重要的人,送给它们鲜花——磁盘空间。确保你有足够的磁盘空间用来记录日志。由于磁盘满而变成只读的文件系统并不是一件愉快的事情。

还需要知道什么是不正常的。这是一件非常困难的事情,但是从长远来看,这将使你日后受益匪浅。你应该知道什么正在进行和什么时候出现了一些异常。确保你知道那。

第三篇也是最后的一篇文章里,我将就这次研讨会中问到的一些比较好的安全问题进行回答。现在开始看这个完整的免费的网络点播研讨会吧。

Mike Guthrie 就职于能源部,主要做红队交战和渗透测试。


via: https://www.linux.com/news/webinar/2017/how-keep-hackers-out-your-linux-machine-part-2-three-more-easy-security-tips

作者:MIKE GUTHRIE 译者:zhousiyu325 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

如果你是第一次安装 MySQL 或 MariaDB,你可以执行 mysql_secure_installation 脚本来实现基本的安全设置。

其中的一个设置是数据库的 root 密码 —— 该密码必须保密,并且只在必要的时候使用。如果你需要修改它(例如,当数据库管理员换了人 —— 或者被解雇了!)。

建议阅读:在 Linux 中恢复 MySQL 或 MariaDB 的 Root 密码

这篇文章迟早会派上用场的。我们讲说明怎样来在 Linux 中修改 MySQL 或 MariaDB 数据库服务器的 root 密码。

尽管我们会在本文中使用 MariaDB 服务器,但本文中的用法说明对 MySQL 也有效。

修改 MySQL 或 MariaDB 的 root 密码

你知道 root 密码,但是想要重置它,对于这样的情况,让我们首先确定 MariaDB 正在运行:

------------- CentOS/RHEL 7 and Fedora 22+ ------------- 
# systemctl is-active mariadb
------------- CentOS/RHEL 6 and Fedora -------------
# /etc/init.d/mysqld status

Check MySQL Status

检查 MysQL 状态

如果上面的命令返回中没有 active 这个关键词,那么该服务就是停止状态,你需要在进行下一步之前先启动数据库服务:

------------- CentOS/RHEL 7 and Fedora 22+ ------------- 
# systemctl start mariadb
------------- CentOS/RHEL 6 and Fedora -------------
# /etc/init.d/mysqld start

接下来,我们将以 root 登录进数据库服务器:

# mysql -u root -p

为了兼容不同版本,我们将使用下面的声明来更新 mysql 数据库的用户表。注意,你需要将 YourPasswordHere 替换为你为 root 选择的新密码。

MariaDB [(none)]> USE mysql;
MariaDB [(none)]> UPDATE user SET password=PASSWORD('YourPasswordHere') WHERE User='root' AND Host = 'localhost';
MariaDB [(none)]> FLUSH PRIVILEGES;

要验证是否操作成功,请输入以下命令退出当前 MariaDB 会话。

MariaDB [(none)]> exit;

然后,敲回车。你现在应该可以使用新密码连接到服务器了。

Change MySQL/MariaDB Root Password

修改 MysQL/MariaDB Root 密码

小结

在本文中,我们说明了如何修改 MariaDB / MySQL 的 root 密码 —— 或许你知道当前所讲的这个方法,也可能不知道。

像往常一样,如果你有任何问题或者反馈,请尽管使用下面的评论框来留下你宝贵的意见或建议,我们期待着您的留言。


作者简介:

Gabriel Cánepa是一位来自阿根廷圣路易斯的 Villa Mercedes 的 GNU/Linux 系统管理员和 web 开发者。他为世界范围内的主要的消费产品公司工作,也很钟情于在他日常工作的方方面面中使用 FOSS 工具来提高生产效率。


via: http://www.tecmint.com/change-mysql-mariadb-root-password/

作者:Gabriel Cánepa 译者:GOLinux 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出