
题图:尼泊尔 ABC 中途驿站 2017
《Kali Linux解密》不完全翻译手册
# 5.3 服务配置
在本节中,我们将集中了解一下应用服务或者是在后台运行,为系统提供多种功能的应用程序。我们将从配置文件开始,进而解释一些重要服务(比如 SSH、PostgreSQL、Apache)的运行机制,以及如何配置这些服务。
## 5.3.1 配置一个特定的应用
当你要配置一个未知软件包的时候,必须要按照一定的步骤来。首先,你应当去读一下软件包作者所写的文档。最好是从 /etc/share/doc/package-somthing/README.Debian 开始。这个文件经常会包含软件包的大部分信息,还有一些相关文档的链接。优先阅读这份文档会帮你节省很多时间,也会避免一些迷惑和沮丧,因为这里面还包含了针对最常见问题及错误的的详细信息。
其次,你应该去看看软件的官方文档。在章节 6.1 - “文档源” 中会就如何寻找文档信息给出一些建议。dpkg -L package-name 命令会给出软件包中的文件列表,你可以就此来快速定位到可用的文档说明(当然也包括在 /etc/ 目录下的配置文件)。同时,dpkg -s package-name 会显示软件包的元数据及相关推荐的软件包,通过这些不但可能找到相关文档,还可能找到一些简化配置的实用工具。
最后,配置文件大多都是自带说明信息的。对于每一项配置,都有大量关于可选值的描述信息。某些情况下,你可以不修改配置文件的任何内容就能够直接启动软件。其他情况下,配置文件的样例都放置在 /etc/share/doc/package-name/examples 目录下,这些样例文件可以作为最终配置文件的基础配置进行修改。
## 5.3.2 配置 SSH 支持远程登录
SSH 服务可以让你远程登录到机器上,进行文件传输和命令执行。它是远程连接机器的工业级工具( ssh )及服务( ssd )。
虽然默认安装了 openssh-server 软件包,但是 SSH 服务默认是禁用的,所以它不会随系统而启动。你可以通过 systemctl start ssh 命令手动启动,或者通过 systemctl enable ssh 配置其随系统启动。
SSH 服务默认已经有了一个健全合理的配置,但是介于这个服务的强大能力和天生敏感性,最好还是能够知道通过配置文件(/etc/ssh/sshdconfig )还能做哪些事情。关于所有选项的信息都包含在 sshd_config(5) 里。
默认配置禁用了 root 用户基于密码的登录方式,这意味着你必须先用 ssh-keygen 生成 SSH 秘钥。你可以通过设置 PasswordAuthentication 为 no 来将这项设置应用到所有用户,也可以将 PermitRootLogin 设置为 yes 来取消限制。SSH 服务默认监听系统的 22 端口,你也可以通过配置文件的 Port 字段来修改此端口。
为了使新的配置生效,你可以运行 systemctl reload ssh 。
生成新的 SSH 主机密钥
---------------------------------------
每一个 SSH 服务器都有自己的加密密钥,它们存储在 /etc/ssh/sshhost*,被称之为 “SSH 主机密钥”。如果你对机密性有要求,那么这些密钥必须要妥善保管,也不能在多个主机间共享。
当你是通过写入全盘镜像的方式(而不是用 debian 安装程序 )安装的系统,那么镜像里可能已经包含了预生成的主机密钥,这些密钥需要替换为你新生成的密钥。同时,这个镜像自带的 root 默认密码也需要重置。你可以通过以下命令来完成上述修改:
# passwd [...]
# rm /etc/ssh/ssh_host_*
# dpkg-reconfigure openssh-server
# service ssh restart
## 5.3.3 配置 PostgreSQL 数据库
PostgreSQL 是一个数据库服务,它主要是为其他服务提供数据存储服务。这些服务一般来说都会通过网络访问数据库,并且需要提供一定的认证凭证才能连接。因此,配置这些服务访问之前就需要先创建 PostgreSQL 数据库和有适当权限的用户账户。为了能够实现以上内容,首先我们先用 systemctl start postgresql 命令启动服务。
PostgreSQL 多版本支持
---------------------------------------
PostgreSQL 软件包支持多版本的数据同时安装,它也可以同时处理多个集群(一个集群就是被同一个 postmaster 服务的数据库集合)。相应的配置文件在 /etc/postgresql/version/cluster-name 。
为了能够让多集群并行运行,每一个新集群都会分配到下一个可用的端口(第二个集群端口通常是 5433 )。postgresql.service 文件是一个空 shell ,由于每个集群都有自己的单元结构( postgresql@version-cluster.service ),因此很容易在所有集群上进行操作。
### 5.3.3.1 连接类型和客户端认证
默认情况下,PostgreSQL 通过两种方式监听进入的连接:本地网络接口的 TCP 5432 端口和基于文件的 socket /var/run/postgresql/.s.PGSQL.5432 。这些内容可以在配置文件 postgresql.conf 中修改,包括 listenaddresses 指定监听的地址、port 指定监听的 TCP 端口、 unixsocketdirectories 指定基于文件的 socket 创建地址。
依据不同的连接类型,客户端有不同的认证方式。配置文件 pghba.conf 定义了谁可以连接每一个 socket 且应该如何认证。默认情况下,基于文件 socket 的连接使用 Unix 用户账号作为 PostgreSQL 的用户,且假定不需要进一步的认证。基于 TCP 的连接则需要提供用户名和密码进行验证,这里的用户名和密码不是 Unix 系统的,而是 PostgreSQL 自己管理的用户。
postgres 用户是比较特别的一个,它拥有所有数据的管理权限。我们将使用这个用户来创建新的用户和数据库。
### 5.3.3.2 创建用户和数据库
createuser 命令用于添加一个新用户,dropuser 则是删除。同样的,createdb 命令用于添加一个数据库,dropdb 则是移除数据库。每一个命令都有它们自己的文档手册,这里我们将会讨论一下其中一些参数选项。每一个命令都是在默认的集群(运行在 5432 端口)上执行,但是你也可以通过传递 —port=port 参数来修改另一个集群上的用户和数据库。
这些命令首先都必须要连接到 PostgreSQL 服务器上才能运行,同时它们也必须有运行这些指定操作的足够权限。最简单的方式就是使用 Unix 的 postgres 账户,并且通过基于文件的 socket 连接到服务器:
# su - postgres
$ createuser -P king_phisher
Enter password for new role:
Enter it again:
$ createdb -T template0 -E UTF-8 -O king_phisher king_phisher
$ exit
在上面的例子中,-P 选项要求 createuser 在创建 kingphisher 用户的时候设置一个密码。再看 createdb 命令,-O 选项指定了新数据库的所有者(有这个数据库的所有权限,包括创建数据表、授权权限等等),我们还希望使用 Unicode 字符,因此添加了 -E UTF-8 选项来设定编码,当然还要使用 -T 选项来选择一个数据库模板。
我们现在可以测试一下了,用 king_phisher 用户( -U kingphisher )通过本地监听( -h localhost )的 socket 来连接数据库:
# psql -h localhost -U king_phisher king_phisher
Password for user king_phisher:
psql (9.5.2)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help. king_phisher=>
如你所见,连接成功了。
### 5.3.3.3 管理 PostgreSQL 集群
首先,值得注意的是 “PostgreSQL 集群”的概念是 Debian-specific 添加的,你在 PostgreSQL 的官方文档中是找不到相关内容的。从 PostgreSQL 工具的视角来看,集群仅仅是运行在指定端口上的一个服务器实例。
也就是说,Debian 的 postgresql-common 软件包提供了多种工具来管理所谓的集群:pg_createcluster、pg_dropcluster、pg_ctlcluster、pg_upgradecluster、pg_renamecluster 以及 pg_lsclusters 。我们在这里不会覆盖所有工具,但是你可以通过查询它们各自的官网手册来了解更多信息。
你必须要知道的是,当一个新的 PostgreSQL 安装到系统上后,它会在下一个端口(一般是 5433 )上创建一个新集群,而在你将旧版本的数据库迁移到新的集群上之前,必须要继续使用老的版本。
你可以通过 pg_lsclusters 来获取所有集群的列表和他们的状态。更重要的是,你可以通过 pg_upgradecluster old-version cluster-name 将集群自动迁移到最新的 PostgreSQL 版本。为了确保成功,你还必须首先移除为新版本创建的(空)集群( pg_dropcluster new-version cluster-name )。旧的集群在这个过程中不会被删除,但是也同样不会被自动启动。一旦你确认新升级的集群可以正常工作后,就可以彻底删除它们了。
## 5.3.4 配置 Apache
标准的 Kali 系统安装会包含一个 apache2 的 Apache web server 。这个网络服务也是默认禁用的,你可以通过 systemctl start apache2 手动启动服务器。
现在越来越多的应用都习惯于通过 web 方式来发布。不管是你是想本地使用还是让应用通过网络来发布,了解一些 Apache 的知识是相当有用的。
Apache 是一个模块化的服务器软件,它的许多功能都是靠扩展模块实现,这些模块是在服务器主程序初始化的时候加载的。默认的设置只会启动最常用的一些模块,但是启用一个新的模块也是很容易的,只需要运行 a2enmod modulexx 。a2dismod modulexx 则可以禁用一个模块。这些命令其实仅仅是在 /etc/apache2/mods-enabled/ 下创建(或删除)了指向实际文件( 存储在 /etc/apache2/mods-available/ )的符号链接而已。
Apache 有很多的可用模块,但是有两个是首要推荐的: PHP 和 SSL 。使用 PHP 写成的 Web 应用,实际上是由 libapache-mod-php 软件包提供的模块支持运行的,软件包安装的时候也会自动启用这个模块。
Apache 2.4 包含了对 HTTPS 支持的 SSL 模块。首先,它要通过 a2enmod ssl 来启用,之后还要在配置文件里添加必须的字段。 /etc/apache2/sites-available/default-ssl.conf 是一个标准的配置样例。更多详细信息请查看:http://httpd.apache.org/docs/2.4/mod/mod_ssl.html 。
标准 Apache 模块列表可以在线上找到:http://httpd.apache.org/docs/2.4/mod/index.html 。
默认配置下,web 服务器会监听 80 端口(在 /etc/apache2/ports.conf 里进行配置),服务器页面文件的目录是 /var/www/html/ ( 在 /etc/apache2/sites-enabled/000-default.conf 里进行配置)。
### 5.3.4.1 配置虚拟主机
虚拟主机是 web 服务器的另一个身份 ID 。同一个 Apache 进程可以同时为多个网站服务(比如,www.kali.org 和 www.offensive-security.com ),这是由于 HTTP 请求中包含了请求的网站名和 URL 本地路径部分(这项特性被人们熟知的名字是 name-based virtual hosts )。
Apache 2 的默认配置开启了基于名字的虚拟主机( name-based virtual hosts )。需要补充说明的是,在 /etc/apache2/sites-enabled/000-default.conf 文件中定义了一个默认的虚拟主机配置,如果客户端发来的请求无法匹配任何一个主机,则这个默认虚拟主机配置将会被使用。
重要说明
---------------------------------------
对于未知虚拟主机的请求都会被第一个定义的虚拟主机配置所处理,因此,默认情况下 Apache 软件包自带了 000-default.conf 文件,这个文件按照排序而言,一定会出现在你所创建的配置之前,这样就可以保证默认的配置优先生效。
每一个虚拟主机都是通过 /etc/apache2/sites-available/ 目录下的配置文件描述的。这个文件一般是以网站的主机名加一个 .conf 的后缀来命名( www.example.com.conf ),然后就可以通过 a2ensite www.example.com 来启动这个新虚拟主机(网站)。这里有一个最小化配置的样例,网站的文件存储在 /srv/www.example.com/www/ (通过 DocumentRoot 选项定义)。
ServerName www.example.com
ServerAlias example.com
DocumentRoot /srv/www.example.com/www
你还可以考虑添加 CustomLog 和 ErrorLog 选项来配置服务器的日志输出。
### 5.3.4.1 常用指令
这一小节将简要介绍一些 Apache 最常用的配置指令。
主配置文件通常包含了几个 “目录”块,这些目录块可以指定服务器根据不同路径的文件提供不同的行为。比如,一个块常常包含 Options 和 AllowOverride 指令:
Options Includes FollowSymLinks
AllowOverride All
DirectoryIndex index.php index.html index.htm
DirectoryIndex 定义了当客户端请求匹配这个目录的时候应该访问的文件列表及顺序,列表中第一个被找到的文件将作为客户端请求的返回。
Options 指令后跟着要开启的选项。None 值则禁用所有选项,相反,ALL 则除了 MultiViews 之外的选项都开启。可用的选项包含:
ExecCGI — 表明可以执行 CGI 脚本
FollowSymLinks — 表明符号链接是可用的,返回中应该包含这类链接的内容。
Includes — 开启 SSI( Server Side Includes )。这些指令包含在 HTML 页面中,随着请求而被动态的执行。
Indexes — 如果 HTTP 请求的目录下没有 index 文件(通过 DirectoryIndex 指定的文件),则让服务器列出目录下的所有内容。
MultiViews — 开启页面内容协商。这个选项可以让服务器以浏览器预设的偏好语言来返回 web 内容。
#### 5.3.4.2.1 认证
在有些情况下,网站的部分内容是需要做限制的,只有提供了用户名和密码的用户才能被授权访问。
.htaccess 文件包含了 Apache 的配置指令,这可以让每次请求都从 .htaccess 所在目录关联一个元素托尔斯泰。这些指令都是递归的,覆盖了所有子目录。
大多数在 Directory 块的指令在 .htaccess 中都是合法的。AllowOverride 指令可以列出 . htaccess 方式下所有可以被启动或禁用的选项。这个选项的一个普遍应用是限制 ExecCGI ,这样管理员就可以在 web 服务器标识下( www-data 用户)选择哪些用户可以运行程序。
例 5.3 通过 .htaccess 配置认证
Require valid-user
AuthName "Private directory"
AuthType Basic
AuthUserFile /etc/apache2/authfiles/htpasswd-private
没有安全保障的基础认证
---------------------------------------
上面例子中使用的认证系统( Basic )安全性很低,密码是通过明文(仅仅用了 base64 方式编码,而非加密)发送的。还需要注意的是,通过这种机制保护的文档,在网络上还是明文传输的。如果安全性要求较高,那么整个 HTTP session 都应该用 TLS ( Transport Layer Security )来加密。
/etc/apache2/authfiles/htpasswd-private 文件包含了用户名和密码,它通常是用 htpasswd 命令来修改的。举例来说,下面的命令常被用来添加一个用户或修改他们的密码:
#htpasswd /etc/apache2/authfiles/htpasswd-private user3
New password: Re-type new password: Adding password for user user3
#### 5.3.4.2.2 限制访问
Require 指令用于控制目录访问限制(这是一个递归指令,包含子目录)。
Require 指令可以通过多种规则对访问进行限制。通常我们仅会将访问控制描述为对客户端 IP 地址的限制,但是 Require 指令可比这强大多了,尤其是当在 RequireALL 块中添加多个指令的时候。
举个例子,你可以通过以下指令限制本地的访问:
Require ip 192.168.0.0/16
关于《Kali Linux 解密》
---------------------------------------
不管你是信息安全的新手,还是安全老手,这本 Kali Linux 官方出品 的指导手册都可以给你一些惊喜。古语云“柢固则生长,根深则视久”,这句话也适用于信息安全领域。如果你想要拥有使用 Kali Linux 的专家级能力,你必须熟知各种渗透测试姿势的内在原理。而这就是本书所要向你讲述的内容 —- 如何让你成为一个 Kali Linux 资深玩家。
为了能够让大家边学习边实践,达到一起读书的目的,公众号将尽量保持一周两到三篇的速度更新,欢迎大家持续关注。
破阵子
醉里挑灯看剑
梦回吹角连营
八百里分麾下炙
五十弦翻塞外声
猎客
·
公元
公众号:NetHunterPark
关注移动安全及渗透测试






