分类 技术 下的文章

在树莓派 2B 上如何安装 FreeBSD 10 或 FreeBSD 11(current)?怎么在 Linux,OS X,FreeBSD 或类 Unix 操作系统上烧录 SD 卡?

在树莓派 2B 上安装 FreeBSD 10 或 FreeBSD 11(current)很容易。使用 FreeBSD 操作系统可以打造一个非常易用的 Unix 服务器。FreeBSD-CURRENT 自2012年十一月以来一直支持树莓派,2015年三月份后也开始支持树莓派2了。在这个快速教程中我将介绍如何在树莓派 2B 上安装 FreeBSD 11 current arm 版。

1. 下载 FreeBSD-current 的 arm 镜像

你可以 访问这个页面来下载 树莓派2的镜像。使用 wget 或 curl 命令来下载镜像:

$ wget ftp://ftp.freebsd.org/pub/FreeBSD/snapshots/arm/armv6/ISO-IMAGES/11.0/FreeBSD-11.0-CURRENT-arm-armv6-RPI2-20151016-r289420.img.xz

$ curl -O ftp://ftp.freebsd.org/pub/FreeBSD/snapshots/arm/armv6/ISO-IMAGES/11.0/FreeBSD-11.0-CURRENT-arm-armv6-RPI2-20151016-r289420.img.xz

2. 解压 FreeBSD-current 镜像

执行以下命令中的任何一个:

$ unxz FreeBSD-11.0-CURRENT-arm-armv6-RPI2-20151016-r289420.img.xz

$ xz --decompress FreeBSD-11.0-CURRENT-arm-armv6-RPI2-20151016-r289420.img.xz

3. 设置 SD

你可以在 OS X,Linux,FreeBSD,MS-Windows 和类 Unix 系统来烧录 SD 卡。

在 Mac OS X 下烧录 FreeBSD-current

使用下面的 dd 命令:

$ diskutil list
$ diskutil unmountDisk /dev/diskN
$ sudo dd if=FreeBSD-11.0-CURRENT-arm-armv6-RPI2-20151016-r289420.img of=/dev/disk2 bs=64k

示例输出:

1024+0 records in
1024+0 records out
1073741824 bytes transferred in 661.669584 secs (1622776 bytes/sec)

使用 Linux/FreeBSD 或者类 Unix 系统来烧录 FreeBSD-current

语法是这样:

$ dd if=FreeBSD-11.0-CURRENT-arm-armv6-RPI2-20151016-r289420.img of=/dev/sdb bs=1M

确保使用实际的 SD 卡的设备名称来替换 /dev/sdb(LCTT 译注:千万注意不要写错了)。

4. 引导 FreeBSD

在树莓派 2B 上插入 SD 卡。你需要连接键盘,鼠标和显示器。我使用的是 USB 转串口线来连接显示器的:

Fig.01 RPi USB based serial connection

图01 基于树莓派 USB 的串行连接

在下面的例子中,我使用 screen 命令来连接我的 RPI:

## Linux 上 ##
screen /dev/tty.USB0 115200

## OS X 上 ##
screen /dev/cu.usbserial 115200

## Windows 请使用 Putty.exe ##

FreeBSD RPI 启动输出样例:

Gif 01: Booting FreeBSD-current on RPi 2

图02: 在树莓派 2上引导 FreeBSD-current

5. FreeBSD 在 RPi 2上的用户名和密码

默认的密码是 freebsd/freebsd 和 root/root。

到此为止, FreeBSD-current 已经安装并运行在树莓派 2上。


via: http://www.cyberciti.biz/faq/how-to-install-freebsd-on-raspberry-pi-2-model-b/

作者:Vivek Gite 译者:strugglingyouth 校对:wxy

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

红帽企业版 linux(RHEL)和它的社区版分支——CentOS,提供10年的生命周期,这意味着 RHEL/CentOS 的每个版本会提供长达10年的安全更新。虽然这么长的生命周期为企业用户提供了迫切需要的系统兼容性和可靠性,但也存在一个缺点:随着底层的 RHEL/CentOS 版本接近生命周期的结束,核心应用和运行时环境变得陈旧过时。例如 CentOS 6.5,它的生命周期结束时间是2020年11月30日,其所携带的 Python 2.6.6和 MySQL 5.1.73,以今天的标准来看已经非常古老了。

另一方面,在 RHEL/CentOS 上试图手动升级开发工具链和运行时环境存在使系统崩溃的潜在可能,除非所有依赖都被正确解决。通常情况下,手动升级都是不推荐的,除非你知道你在干什么。

SCL

软件集 Software Collections (SCL)源出现了,以帮助解决 RHEL/CentOS 下的这种问题。SCL 的创建就是为了给 RHEL/CentOS 用户提供一种以方便、安全地安装和使用应用程序和运行时环境的多个(而且可能是更新的)版本的方式,同时避免把系统搞乱。与之相对的是第三方源,它们可能会在已安装的包之间引起冲突。

最新的 SCL 提供了:

  • Python 3.3 和 2.7
  • PHP 5.4
  • Node.js 0.10
  • Ruby 1.9.3
  • Perl 5.16.3
  • MariaDB 和 MySQL 5.5
  • Apache httpd 2.4.6

在这篇教程的剩余部分,我会展示一下如何配置 SCL 源,以及如何安装和启用 SCL 中的包。

配置 SCL 源

SCL 可用于 CentOS 6.5 及更新的版本。要配置 SCL 源,只需执行:

$ sudo yum install centos-release-SCL

要启用和运行 SCL 中的应用,你还需要安装下列包:

$ sudo yum install scl-utils-build

执行下面的命令可以查看 SCL 中可用包的完整列表:

$ yum --disablerepo="*" --enablerepo="scl" list available

从 SCL 中安装和启用包

既然你已配置好了 SCL,你可以继续并从 SCL 中安装包了。

你可以搜索 SCL 中的包:

$ yum --disablerepo="*" --enablerepo="scl" search <keyword>

我们假设你要安装 Python 3.3。

继续,就像通常安装包那样使用 yum 安装:

$ sudo yum install python33

任何时候你都可以查看从 SCL 中安装的包的列表,只需执行:

$ scl --list

python33

SCL 的优点之一是安装其中的包不会覆盖任何系统文件,并且保证不会引起与系统中其它库和应用的冲突。

例如,如果在安装 python33 包后检查默认的 python 版本,你会发现默认的版本并没有改变:

$ python --version

Python 2.6.6

如果想使用一个已经安装的 SCL 包,你需要在每个命令中使用 scl 命令显式启用它(LCTT 译注:即想在哪条命令中使用 SCL 中的包,就得通过scl命令执行该命令)

$ scl enable <scl-package-name> <command>

例如,要针对python命令启用 python33 包:

$ scl enable python33 'python --version'

Python 3.3.2

如果想在启用 python33 包时执行多条命令,你可以像下面那样创建一个启用 SCL 的 bash 会话:

$ scl enable python33 bash

在这个 bash 会话中,默认的 python 会被切换为3.3版本,直到你输入exit,退出会话。

简而言之,SCL 有几分像 Python 的虚拟环境,但更通用,因为你可以为远比 Python 更多的应用启用/禁用 SCL 会话。

更详细的 SCL 指南,参考官方的快速入门指南


via: http://xmodulo.com/enable-software-collections-centos.html

作者:Dan Nanni 译者:bianjp 校对:wxy

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

在建站和 web 应用程序交付方面,WordPress 是全球最大的一个平台。全球大约四分之一 的站点现在正在使用开源 WordPress 软件,包括 eBay、 Mozilla、 RackSpace、 TechCrunch、 CNN、 MTV、纽约时报、华尔街日报 等等。

最流行的个人博客平台 WordPress.com,其也运行在 WordPress 开源软件上。而 NGINX 则为 WordPress.com 提供了动力。在 WordPress.com 的用户当中,许多站点起步于 WordPress.com,然后换成了自己运行 WordPress 开源软件;它们中越来越多的站点也使用了 NGINX 软件。

WordPress 的吸引力源于其简单性,无论是对于最终用户还是安装架设。然而,当使用量不断增长时,WordPress 站点的体系结构也存在一定的问题 - 这里有几个方法,包括使用缓存,以及将 WordPress 和 NGINX 组合起来,可以解决这些问题。

在这篇博客中,我们提供了九个提速技巧来帮助你解决 WordPress 中一些常见的性能问题:

  • 缓存静态资源
  • 缓存动态文件
  • 迁移到 NGINX
  • 添加 NGINX 静态链接支持
  • 为 NGINX 配置 FastCGI
  • 为 NGINX 配置 W3TotalCache
  • 为 NGINX 配置 WP-Super-Cache
  • 为 NGINX 配置安全防范措施
  • 配置 NGINX 支持 WordPress 多站点

深入浅出讲述提升 WordPress 性能的九大秘笈

在 LAMP 架构下 WordPress 的性能

大多数 WordPress 站点都运行在传统的 LAMP 架构下:Linux 操作系统,Apache Web 服务器软件,MySQL 数据库软件(通常是一个单独的数据库服务器)和 PHP 编程语言。这些都是非常著名的,广泛应用的开源工具。在 WordPress 世界里,很多人都用的是 LAMP,所以很容易寻求帮助和支持。

当用户访问 WordPress 站点时,浏览器为每个用户创建六到八个连接来连接到 Linux/Apache 上。当用户请求连接时,PHP 即时生成每个页面,从 MySQL 数据库获取资源来响应请求。

LAMP 或许对于数百个并发用户依然能照常工作。然而,流量突然增加是常见的,并且通常这应该算是一件好事。

但是,当 LAMP 站点变得繁忙时,当同时在线的用户达到数千个时,它的瓶颈就会被暴露出来。瓶颈存在主要是两个原因:

  1. Apache Web 服务器 - Apache 的每个/每次连接需要消耗大量资源。如果 Apache 接受了太多的并发连接,内存可能会耗尽,从而导致性能急剧降低,因为数据必须交换到磁盘了。如果以限制连接数来提高响应时间,新的连接必须等待,这也导致了用户体验变得很差。
  2. PHP/MySQL 的交互 - 一个运行 PHP 和 MySQL 数据库服务器的应用服务器上每秒的请求量有一个最大限制。当请求的数量超过这个最大限制时,用户必须等待。超过这个最大限制时也会增加所有用户的响应时间。超过其两倍以上时会出现明显的性能问题。

LAMP 架构的网站出现性能瓶颈是常见的情况,这时就需要升级硬件了 - 增加 CPU,扩大磁盘空间等等。当 Apache 和 PHP/MySQL 的架构超载后,在硬件上不断的提升却跟不上系统资源指数增长的需求。

首选替代 LAMP 架构的是 LEMP 架构 – Linux, NGINX, MySQL, 和 PHP。 (这是 LEMP 的缩写,E 代表着 “engine-x.” 的发音。) 我们在 技巧 3 中会描述 LEMP 架构。

技巧 1. 缓存静态资源

静态资源是指不变的文件,像 CSS,JavaScript 和图片。这些文件往往在网页的数据中占半数以上。页面的其余部分是动态生成的,像在论坛中评论,性能仪表盘,或个性化的内容(可以看看 Amazon.com 产品)。

缓存静态资源有两大好处:

  • 更快的交付给用户 - 用户可以从它们浏览器的缓存或者从互联网上离它们最近的缓存服务器获取静态文件。有时候文件较大,因此减少等待时间对它们来说帮助很大。
  • 减少应用服务器的负载 - 从缓存中检索到的每个文件会让 web 服务器少处理一个请求。你的缓存越多,用户等待的时间越短。

要让浏览器缓存文件,需要在静态文件中设置正确的 HTTP 首部。看看 HTTP Cache-Control 首部,特别是设置了 max-age 参数,Expires 首部,以及 Entity 标记。这里 有详细的介绍。

当启用本地缓存,然后用户请求以前访问过的文件时,浏览器首先检查该文件是否在缓存中。如果在,它会询问 Web 服务器该文件是否改变过。如果该文件没有改变,Web 服务器将立即响应一个304状态码(未改变),这意味着该文件没有改变,而不是返回状态码200 OK 并检索和发送已改变的文件。

要在浏览器之外支持缓存,可以考虑下面讲到的技巧,以及考虑使用内容分发网络(CDN)。CDN 是一​​种流行且​​强大的缓存工具,但我们在这里不详细描述它。在你实现了这里讲到的其它技术之后可以考虑 CDN。此外,当你的站点从 HTTP/1.x 过渡到 HTTP/2 协议时,CDN 的用处可能不太大;根据需要调查和测试,找到你网站需要的正确方法。

如果你转向 NGINX Plus 或将开源的 NGINX 软件作为架构的一部分,建议你考虑 技巧 3,然后配置 NGINX 缓存静态资源。使用下面的配置,用你 Web 服务器的 URL 替换 www.example.com。

server {
    ### 将 www.example.com 替换为你的 URL
    server_name www.example.com;
    root /var/www/example.com/htdocs;
    index index.php;

    access_log /var/log/nginx/example.com.access.log;
    error_log /var/log/nginx/example.com.error.log;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        try_files $uri =404;
        include fastcgi_params;
        ### 使用你 WordPress 服务器的套接字,地址和端口来替换
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        #fastcgi_pass 127.0.0.1:9000;
    }   

    location ~* .(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
        expires max;
        log_not_found off;
        access_log off;
    }
}

技巧 2. 缓存动态文件

WordPress 动态地生成网页,这意味着每次请求时它都要生成一个给定的网页(即使和前一次的结果相同)。这意味着用户随时获得的是最新内容。

想一下,当用户访问一个帖子时,并在文章底部有用户的评论时。你希望用户能够看到所有的评论 - 即使评论刚刚发布。动态内容就是处理这种情况的。

但现在,当帖子每秒出现十几二十几个请求时。应用服务器可能每秒需要频繁生成页面导致其压力过大,造成延误。为了给用户提供最新的内容,每个访问理论上都是新的请求,因此它们不得不在原始出处等待很长时间。

为了防止页面由于不断提升的负载而变得缓慢,需要缓存动态文件。这需要减少文件的动态内容来提高整个系统的响应速度。

要在 WordPress 中启用缓存中,需要使用一些流行的插件 - 如下所述。WordPress 的缓存插件会请求最新的页面,然后将其缓存短暂时间 - 也许只有几秒钟。因此,如果该网站每秒中会有几个请求,那大多数用户获得的页面都是缓存的副本。这也有助于提高所有用户的检索时间:

  • 大多数用户获得页面的缓存副本。应用服务器没有做任何工作。
  • 用户会得到一个之前的崭新副本。应用服务器只需每隔一段时间生成一个崭新页面。当服务器产生一个崭新页面(对于缓存过期后的第一个用户访问),它这样做要快得多,因为它的请求并没有超载。

你可以缓存运行在 LAMP 架构或者 LEMP 架构 上 WordPress 的动态文件(在 技巧 3 中说明了)。有几个缓存插件,你可以在 WordPress 中使用。运用到了最流行的缓存插件和缓存技术,从最简单到最强大的:

  • Hyper-CacheQuick-Cache – 这两个插件为每个 WordPress 页面创建单个 PHP 文件。它支持绕过多个 WordPress 与数据库的连接核心处理的一些动态功能,创建一个更快的用户体验。它们不会绕过所有的 PHP 处理,所以并不会如下面那些取得同样的性能提升。它们也不需要修改 NGINX 的配置。
  • WP Super Cache – 最流行的 WordPress 缓存插件。在它易用的界面易用上提供了许多功能,如下所示。我们在 技巧 7 中展示了一个简单的 NGINX 配置实例。
  • W3 Total Cache – 这是第二流行的 WordPress 缓存插件。它比 WP Super Cache 的功能更强大,但它有些配置选项比较复杂。样例 NGINX 配置,请看 技巧 6。
  • FastCGI – CGI 的意思是 通用网关接口 Common Gateway Interface ,在因特网上发送请求和接收文件的一种通用方式。它不是一个插件,而是一种与缓存交互缓存的方法。FastCGI 可以被用在 Apache 和 Nginx 上,它也是最流行的动态缓存方法;我们在 技巧 5 中描述了如何配置 NGINX 来使用它。

这些插件和技术的文档解释了如何在典型的 LAMP 架构中配置它们。配置方式包括数据库和对象缓存;最小化 HTML、CSS 和 JavaScript;集成流行的 CDN 集成环境。对于 NGINX 的配置,请看列表中的提示技巧。

注意:缓存不会用于已经登录的 WordPress 用户,因为他们的 WordPress 页面都是不同的。(对于大多数网站来说,只有一小部分用户可能会登录)此外,大多数缓存不会对刚刚评论过的用户显示缓存页面,因为当用户刷新页面时希望看到他们的评论。若要缓存页面的非个性化内容,如果它对整体性能来说很重要,可以使用一种称为 碎片缓存(fragment caching) 的技术。

技巧 3. 使用 NGINX

如上所述,当并发用户数超过某一数量时 Apache 会导致性能问题 – 可能是数百个用户同时使用。Apache 对于每一个连接会消耗大量的资源,因而容易耗尽内存。Apache 可以配置连接数的值来避免耗尽内存,但是这意味着,超过限制时,新的连接请求必须等待。

此外,Apache 为每个连接加载一个 mod\_php 模块副本到内存中,即使只有服务于静态文件(图片,CSS,JavaScript 等)。这使得每个连接消耗更多的资源,从而限制了服务器的性能。

要解决这些问题,从 LAMP 架构迁到 LEMP 架构 – 使用 NGINX 取代 Apache 。NGINX 在一定的内存之下就能处理成千上万的并发连接数,所以你不必经历颠簸,也不必限制并发连接数到很小的数量。

NGINX 处理静态文件的性能也较好,它有内置的,容易调整的 缓存 控制策略。减少应用服务器的负载,你的网站的访问速度会更快,用户体验更好。

你可以在部署环境的所有 Web 服务器上使用 NGINX,或者你可以把一个 NGINX 服务器作为 Apache 的“前端”来进行反向代理 - NGINX 服务器接收客户端请求,将请求的静态文件直接返回,将 PHP 请求转发到 Apache 上进行处理。

对于动态页面的生成,这是 WordPress 核心体验,可以选择一个缓存工具,如 技巧 2 中描述的。在下面的技巧中,你可以看到 FastCGI,W3\_Total\_Cache 和 WP-Super-Cache 在 NGINX 上的配置示例。 (Hyper-Cache 和 Quick-Cache 不需要改变 NGINX 的配置。)

技巧 缓存通常会被保存到磁盘上,但你可以用 tmpfs 将缓存放在内存中来提高性能。

为 WordPress 配置 NGINX 很容易。仅需四步,其详细的描述在指定的技巧中:

  1. 添加永久链接的支持 - 让 NGINX 支持永久链接。此步消除了对 .htaccess 配置文件的依赖,这是 Apache 特有的。参见 技巧 4。
  2. 配置缓存 - 选择一个缓存工具并安装好它。可选择的有 FastCGI cache,W3 Total Cache, WP Super Cache, Hyper Cache, 和 Quick Cache。请看技巧 5、 6 和 7。
  3. 落实安全防范措施 - 在 NGINX 上采用对 WordPress 最佳安全的做法。参见 技巧 8。
  4. 配置 WordPress 多站点 - 如果你使用 WordPress 多站点,在 NGINX 下配置子目录,子域,或多域名架构。见 技巧9。

技巧 4. 让 NGINX 支持永久链接

许多 WordPress 网站依赖于 .htaccess 文件,此文件为 WordPress 的多个功能所需要,包括永久链接支持、插件和文件缓存。NGINX 不支持 .htaccess 文件。幸运的是,你可以使用 NGINX 的简单而全面的配置文件来实现大部分相同的功能。

你可以在你的主 server 块下添加下面的 location 块中为使用 NGINX 的 WordPress 启用 永久链接。(此 location 块在其它代码示例中也会被包括)。

try\_files 指令告诉 NGINX 检查请求的 URL 在文档根目录(/var/www/example.com/htdocs)下是作为文件($uri**)还是目录(**$uri/) 存在的。如果都不是,NGINX 将重定向到 /index.php,并传递查询字符串参数作为参数。

server {
    server_name example.com www.example.com;
    root /var/www/example.com/htdocs;
    index index.php;

    access_log /var/log/nginx/example.com.access.log;
    error_log  /var/log/nginx/example.com.error.log;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }
}

技巧 5. 在 NGINX 中配置 FastCGI

NGINX 可以缓存来自 FastCGI 应用程序的响应,如 PHP 响应。此方法可提供最佳的性能。

对于开源的 NGINX,编译入第三方模块 ngx\_cache\_purge 可以提供缓存清除能力,配置代码如下所示。NGINX Plus 已经包含了它自己实现此代码。

当使用 FastCGI 时,我们建议你安装 NGINX 辅助插件 并使用下面的配置文件,尤其是要注意 fastcgi\_cache\_key 的使用和包括 fastcgi\_cache\_purge 的 location 块。当页面发布或有改变时,有新评论被发布时,该插件会自动清除你的缓存,你也可以从 WordPress 管理控制台手动清除。

NGINX 的辅助插件还可以在你网页的底部添加一个简短的 HTML 代码,以确认缓存是否正常并显示一些统计数据。(你也可以使用 $upstreamcachestatus 确认缓存功能是否正常。)

fastcgi_cache_path /var/run/nginx-cache levels=1:2       
               keys_zone=WORDPRESS:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";

server {
    server_name example.com www.example.com;
    root /var/www/example.com/htdocs;
    index index.php;

    access_log /var/log/nginx/example.com.access.log;
    error_log  /var/log/nginx/example.com.error.log;

    set $skip_cache 0;

    ### POST 请求和带有查询参数的网址应该交给 PHP
    if ($request_method = POST) {
        set $skip_cache 1;
    }   

    if ($query_string != "") {
        set $skip_cache 1;
    }   

    ### 以下 uris 中包含的部分不缓存
    if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php
                         |sitemap(_index)?.xml") {
        set $skip_cache 1;
    }   

    ### 不要为登录用户或最近的评论者进行缓存
    if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass
        |wordpress_no_cache|wordpress_logged_in") {
        set $skip_cache 1;
    }

    location / {
        try_files $uri $uri/ /index.php?$args;
    }    

    location ~ \.php$ {
        try_files $uri /index.php;
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_cache_bypass $skip_cache;
        fastcgi_no_cache $skip_cache;
        fastcgi_cache WORDPRESS;
        fastcgi_cache_valid  60m;
    }

    location ~ /purge(/.*) {
        fastcgi_cache_purge WORDPRESS "$scheme$request_method$host$1";
    }   

    location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png
                      |ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {

        access_log off; 
        log_not_found off;
        expires max;
    }

    location = /robots.txt {
        access_log off;
        log_not_found off;
    }

    location ~ /\. {
        deny  all; 
        access_log off;
        log_not_found off;
    }
}

技巧 6. 为 NGINX 配置 W3\_Total\_Cache

W3 Total Cache, 是 W3-Edge 的 Frederick Townes 出品的, 是一个支持 NGINX 的 WordPress 缓存框架。其有众多选项配置,可以替代 FastCGI 缓存。

这个缓存插件提供了各种缓存配置,还包括数据库和对象的缓存,最小化 HTML、CSS 和 JavaScript,并可选与流行的 CDN 整合。

这个插件会通过写入一个位于你的域的根目录的 NGINX 配置文件来控制 NGINX。

server {
    server_name example.com www.example.com;

    root /var/www/example.com/htdocs;
    index index.php;
    access_log /var/log/nginx/example.com.access.log;
    error_log  /var/log/nginx/example.com.error.log;

    include /path/to/wordpress/installation/nginx.conf;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        try_files $uri =404;
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
    }
}

技巧 7. 为 NGINX 配置 WP Super Cache

WP Super Cache 是由 Donncha O Caoimh 开发的, 他是 Automattic 的一个 WordPress 开发者, 这是一个 WordPress 缓存引擎,它可以将 WordPress 的动态页面转变成静态 HTML 文件,以使 NGINX 可以很快的提供服务。它是第一个 WordPress 缓存插件,和其它的相比,它更专注于某一特定的领域。

配置 NGINX 使用 WP Super Cache 可以根据你的喜好而进行不同的配置。以下是一个示例配置。

在下面的配置中,带有名为 supercache 的 location 块是 WP Super Cache 特有的部分。 WordPress 规则的其余代码用于不缓存已登录用户的信息,不缓存 POST 请求,并对静态资源设置过期首部,再加上标准的 PHP 处理;这部分可以根据你的需求进行定制。

server {
    server_name example.com www.example.com;
    root /var/www/example.com/htdocs;
    index index.php;

    access_log /var/log/nginx/example.com.access.log;
    error_log  /var/log/nginx/example.com.error.log debug;

    set $cache_uri $request_uri;

    ### POST 请求和带有查询字符串的网址应该交给 PHP
    if ($request_method = POST) {
        set $cache_uri 'null cache';
    }  
    if ($query_string != "") {
        set $cache_uri 'null cache';
    }   

    ### 以下 uris 中包含的部分不缓存
    if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php
                          |wp-.*.php|/feed/|index.php|wp-comments-popup.php
                          |wp-links-opml.php|wp-locations.php |sitemap(_index)?.xml
                          |[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {

        set $cache_uri 'null cache';
    }  

    ### 不对已登录用户和最近的评论者使用缓存
    if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+
                         |wp-postpass|wordpress_logged_in") {
        set $cache_uri 'null cache';
    }

    ### 当请求的文件存在时使用缓存,否则将请求转发给 WordPress
    location / {
        try_files /wp-content/cache/supercache/$http_host/$cache_uri/index.html 
                  $uri $uri/ /index.php;
    }    

    location = /favicon.ico {
        log_not_found off; 
        access_log off;
    }

    location = /robots.txt {
        log_not_found off
        access_log off;
    }

    location ~ .php$ {
        try_files $uri /index.php;
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        #fastcgi_pass 127.0.0.1:9000;
    }

    ### 尽可能的缓存静态文件
    location ~*.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css
           |rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2
           |doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
        expires max;
        log_not_found off;
        access_log off;
    }
}

技巧 8. 为 NGINX 配置安全防范措施

为了防止攻击,可以控制对关键资源的访问并限制机器人对登录功能的过量攻击。

只允许特定的 IP 地址访问 WordPress 的仪表盘。

### 对访问 WordPress 的仪表盘进行限制
location /wp-admin {
    deny  192.192.9.9;
    allow 192.192.1.0/24;
    allow 10.1.1.0/16;
    deny  all;
}

只允许上传特定类型的文件,以防止恶意代码被上传和运行。

### 当上传的不是图像,视频,音乐等时,拒绝访问。
location ~* ^/wp-content/uploads/.*.(html|htm|shtml|php|js|swf)$ {
    deny all;
}

拒绝其它人访问 WordPress 的配置文件 wp-config.php。拒绝其它人访问的另一种方法是将该文件的一个目录移到域的根目录之上的目录。

### 拒绝其它人访问 wp-config.php
location ~* wp-config.php {
    deny all;
}

wp-login.php 进行限速来防止暴力破解。

### 拒绝访问 wp-login.php
location = /wp-login.php {
    limit_req zone=one burst=1 nodelay;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    #fastcgi_pass 127.0.0.1:9000;
}

技巧 9. 配置 NGINX 支持 WordPress 多站点

WordPress 多站点 WordPress Multisite ,顾名思义,这个版本 WordPress 可以让你以单个实例管理两个或多个网站。WordPress.com 运行的就是 WordPress 多站点,其主机为成千上万的用户提供博客服务。

你可以从单个域的任何子目录或从不同的子域来运行独立的网站。

使用此代码块添加对子目录的支持。

### 在 WordPress 多站点中添加对子目录结构的支持
if (!-e $request_filename) {
    rewrite /wp-admin$ $scheme://$host$uri/ permanent;  
    rewrite ^(/[^/]+)?(/wp-.*) $2 last;                     
    rewrite ^(/[^/]+)?(/.*\.php) $2 last;                   
}

使用此代码块来替换上面的代码块以添加对子目录结构的支持,替换为你自己的子目录名。

### 添加支持子域名
server_name example.com *.example.com;

旧版本(3.4以前)的 WordPress 多站点使用 readfile() 来提供静态内容。然而,readfile() 是 PHP 代码,它会导致在执行时性能会显著降低。我们可以用 NGINX 来绕过这个非必要的 PHP 处理。该代码片段在下面被(==============)线分割出来了。

### 避免对子目录中 /blogs.dir/ 结构执行  PHP readfile() 
location ^~ /blogs.dir {
    internal;
    alias /var/www/example.com/htdocs/wp-content/blogs.dir;
    access_log off;
    log_not_found off;
    expires max;
}

============================================================

### 避免对子目录中 /files/ 结构执行  PHP readfile() 
    location ~ ^(/[^/]+/)?files/(?.+) {
    try_files /wp-content/blogs.dir/$blogid/files/$rt_file /wp-includes/ms-files.php?file=$rt_file;
    access_log off;
    log_not_found off;
    expires max;
}

============================================================

### 子域路径的WPMU 文件结构
location ~ ^/files/(.*)$ {
    try_files /wp-includes/ms-files.php?file=$1 =404;
    access_log off;
    log_not_found off;
    expires max;
}

============================================================

### 映射博客 ID 到特定的目录
map $http_host $blogid {
    default           0;
    example.com       1;
    site1.example.com 2;
    site1.com         2;
}

结论

可扩展性对许多要让他们的 WordPress 站点取得成功的开发者来说是一项挑战。(对于那些想要跨越 WordPress 性能门槛的新站点而言。)为 WordPress 添加缓存,并将 WordPress 和 NGINX 结合,是不错的答案。

NGINX 不仅用于 WordPress 网站。世界上排名前 1000、10000 和 100000 网站中 NGINX 也是 遥遥领先的 web 服务器

欲了解更多有关 NGINX 的性能,请看我们最近的博客,让应用性能提升 10 倍的 10 个技巧

NGINX 软件有两个版本:

  • NGINX 开源软件 - 像 WordPress 一样,此软件你可以自行下载,配置和编译。
  • NGINX Plus - NGINX Plus 包括一个预构建的参考版本的软件,以及服务和技术支持。

想要开始,先到 nginx.org 下载开源软件并了解下 NGINX Plus


via: https://www.nginx.com/blog/9-tips-for-improving-wordpress-performance-with-nginx/

作者:Floyd Smith 译者:strugglingyouth 校对:wxy

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

简介

PostgreSQL 是一款强大的,开源的,对象关系型数据库系统。它支持所有的主流操作系统,包括 Linux、Unix(AIX、BSD、HP-UX,SGI IRIX、Mac OS、Solaris、Tru64) 以及 Windows 操作系统。

下面是 Ubuntu 发起者 Mark Shuttleworth 对 PostgreSQL 的一段评价。

PostgreSQL 是一款极赞的数据库系统。刚开始我们在 Launchpad 上使用它的时候,并不确定它能否胜任工作。但我是错了。它很强壮、快速,在各个方面都很专业。

— Mark Shuttleworth.

在这篇简短的指南中,让我们来看看如何在 Ubuntu 15.10 服务器中安装 PostgreSQL 9.4。

安装 PostgreSQL

默认仓库中就有可用的 PostgreSQL。在终端中输入下面的命令安装它。

sudo apt-get install postgresql postgresql-contrib

如果你需要其它的版本,按照下面那样先添加 PostgreSQL 仓库然后再安装。

PostgreSQL apt 仓库 支持 amd64 和 i386 架构的 Ubuntu 长期支持版(10.04、12.04 和 14.04),以及非长期支持版(14.10)。对于其它非长期支持版,该软件包虽然没有完全支持,但使用和 LTS 版本近似的也能正常工作。

Ubuntu 14.10 系统:

新建文件/etc/apt/sources.list.d/pgdg.list

sudo vi /etc/apt/sources.list.d/pgdg.list

用下面一行添加仓库:

deb http://apt.postgresql.org/pub/repos/apt/ utopic-pgdg main

注意: 上面的库只能用于 Ubuntu 14.10。还没有升级到 Ubuntu 15.04 和 15.10。

对于 Ubuntu 14.04,添加下面一行:

deb http://apt.postgresql.org/pub/repos/apt/ trusty-pgdg main

对于 Ubuntu 12.04,添加下面一行:

deb http://apt.postgresql.org/pub/repos/apt/ precise-pgdg main

导入库签名密钥:

wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -

更新软件包列表:

sudo apt-get update

然后安装需要的版本。

sudo apt-get install postgresql-9.4

访问 PostgreSQL 命令窗口

默认的数据库名称和数据库用户名称都是 “postgres”。切换到 postgres 用户进行 postgresql 相关的操作:

sudo -u postgres psql postgres

示例输出:

psql (9.4.5)
Type "help" for help.
postgres=#

要退出 postgresql 窗口,在 psql 窗口输入 \q 退出到终端。

设置 “postgres” 用户密码

登录到 postgresql 窗口,

sudo -u postgres psql postgres

用下面的命令为用户 postgres 设置密码:

postgres=# \password postgres 
Enter new password: 
Enter it again: 
postgres=# \q

要安装 PostgreSQL Adminpack 扩展,在 postgresql 窗口输入下面的命令:

sudo -u postgres psql postgres

postgres=# CREATE EXTENSION adminpack;
CREATE EXTENSION

psql 窗口输入 \q 从 postgresql 窗口退回到终端。

创建新用户和数据库

例如,让我们创建一个新的用户,名为 “senthil”,密码是 “ubuntu”,以及名为 “mydb” 的数据库。

sudo -u postgres createuser -D -A -P senthil

sudo -u postgres createdb -O senthil mydb

删除用户和数据库

要删除数据库,首先切换到 postgres 用户:

sudo -u postgres psql postgres

输入命令:

$ drop database <database-name>

要删除一个用户,输入下面的命令:

$ drop user <user-name>

配置 PostgreSQL-MD5 验证

MD5 验证 要求用户提供一个 MD5 加密的密码用于认证。首先编辑 /etc/postgresql/9.4/main/pg\_hba.conf 文件:

sudo vi /etc/postgresql/9.4/main/pg_hba.conf

按照下面所示添加或修改行

[...]
# TYPE  DATABASE        USER            ADDRESS                 METHOD
# "local" is for Unix domain socket connections only
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
host    all             all             192.168.1.0/24          md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
[...]

其中, 192.168.1.0/24 是我的本地网络 IP 地址。用你自己的地址替换。

重启 postgresql 服务以使更改生效:

sudo systemctl restart postgresql

或者,

sudo service postgresql restart

配置 PostgreSQL TCP/IP 配置

默认情况下,没有启用 TCP/IP 连接,因此其它计算机的用户不能访问 postgresql。为了允许其它计算机的用户访问,编辑文件 /etc/postgresql/9.4/main/postgresql.conf:

sudo vi /etc/postgresql/9.4/main/postgresql.conf

找到下面一行:

[...]
#listen_addresses = 'localhost'
[...]
#port = 5432
[...]

取消该行的注释,然后设置你 postgresql 服务器的 IP 地址,或者设置为 ‘*’ 监听所有用户。你应该谨慎设置所有远程用户都可以访问 PostgreSQL。

[...]
listen_addresses = '*'
[...]
port = 5432
[...]

重启 postgresql 服务保存更改:

sudo systemctl restart postgresql

或者,

sudo service postgresql restart

用 phpPgAdmin 管理 PostgreSQL

phpPgAdmin 是基于 web 用 PHP 写的 PostgreSQL 管理工具。

默认仓库中有可用的 phpPgAdmin。用下面的命令安装 phpPgAdmin:

sudo apt-get install phppgadmin

默认情况下,你可以在本地系统的 web 浏览器用 http://localhost/phppgadmin 访问 phppgadmin。

要访问远程系统,在 Ubuntu 15.10 上做如下操作:

编辑文件 /etc/apache2/conf-available/phppgadmin.conf,

sudo vi /etc/apache2/conf-available/phppgadmin.conf

找到 Require local 的一行在这行前面添加 # 注释掉它。

#Require local

添加下面的一行:

allow from all

保存并退出文件。

然后重启 apache 服务。

sudo systemctl restart apache2

对于 Ubuntu 14.10 及之前版本:

编辑 /etc/apache2/conf.d/phppgadmin:

sudo nano /etc/apache2/conf.d/phppgadmin

注释掉下面一行:

[...]
#allow from 127.0.0.0/255.0.0.0 ::1/128

取消下面一行的注释使所有系统都可以访问 phppgadmin。

allow from all

编辑 /etc/apache2/apache2.conf:

sudo vi /etc/apache2/apache2.conf

添加下面一行:

Include /etc/apache2/conf.d/phppgadmin

然后重启 apache 服务。

sudo service apache2 restart

配置 phpPgAdmin

编辑文件 /etc/phppgadmin/config.inc.php, 做以下更改。下面大部分选项都带有解释。认真阅读以便了解为什么要更改这些值。

sudo nano /etc/phppgadmin/config.inc.php

找到下面一行:

$conf['servers'][0]['host'] = '';

按照下面这样更改:

$conf['servers'][0]['host'] = 'localhost';

找到这一行:

$conf['extra_login_security'] = true;

更改值为 false

$conf['extra_login_security'] = false;

找到这一行:

$conf['owned_only'] = false;

更改值为 true

$conf['owned_only'] = true;

保存并关闭文件。重启 postgresql 服务和 Apache 服务。

sudo systemctl restart postgresql

sudo systemctl restart apache2

或者,

sudo service postgresql restart

sudo service apache2 restart

现在打开你的浏览器并导航到 http://ip-address/phppgadmin。你会看到以下截图。

phpPgAdmin

用你之前创建的用户登录。我之前已经创建了一个名为 “senthil” 的用户,密码是 “ubuntu”,因此我以 “senthil” 用户登录。

phpPgAdmin

然后你就可以访问 phppgadmin 面板了。

phpPgAdmin

用 postgres 用户登录:

phpPgAdmin

就是这样。现在你可以用 phppgadmin 可视化创建、删除或者更改数据库了。

加油!


via: http://www.unixmen.com/install-postgresql-9-4-and-phppgadmin-on-ubuntu-15-10/

作者:SK 译者:ictlyh 校对:wxy

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

Wetty 是什么?

Wetty = Web + tty

作为系统管理员,如果你是在 Linux 桌面下,你可以用它像一个 GNOME 终端(或类似的)一样来连接远程服务器;如果你是在 Windows 下,你可以用它像使用 Putty 这样的 SSH 客户端一样来连接远程,然后同时可以在浏览器中上网并查收邮件等其它事情。

(LCTT 译注:简而言之,这是一个基于 Web 浏览器的远程终端)

第1步: 安装 epel 源

# wget http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
# rpm -ivh epel-release-6-8.noarch.rpm

第2步:安装依赖

# yum install epel-release git nodejs npm -y

(LCTT 译注:对,没错,是用 node.js 编写的)

第3步:在安装完依赖后,克隆 GitHub 仓库

# git clone https://github.com/krishnasrinivas/wetty

第4步:运行 Wetty

# cd wetty
# npm install

第5步:从 Web 浏览器启动 Wetty 并访问 Linux 终端

# node app.js -p 8080

第6步:为 Wetty 安装 HTTPS 证书

# openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes 

等待完成。

第7步:通过 HTTPS 来使用 Wetty

# nohup node app.js --sslkey key.pem --sslcert cert.pem -p 8080 &

第8步:为 wetty 添加一个用户

# useradd <username>
# Passwd <username>

第9步:访问 wetty

http://Your_IP-Address:8080

输入你之前为 wetty 创建的证书然后访问。

到此结束!


via: http://www.unixmen.com/install-wetty-centosrhel-6-x/

作者:Debojyoti Das 译者:strugglingyouth 校对:wxy

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

目标受众

这是一套 Linux 基金会为其系统管理员提供的推荐规范。

这个文档用于帮助那些使用 Linux 工作站来访问和管理项目的 IT 设施的系统管理员团队。

如果你的系统管理员是远程员工,你也许可以使用这套指导方针确保系统管理员的系统可以通过核心安全需求,降低你的IT 平台成为攻击目标的风险。

即使你的系统管理员不是远程员工,很多人也会在工作环境中通过便携笔记本完成工作,或者在家中设置系统以便在业余时间或紧急时刻访问工作平台。不论发生何种情况,你都能调整这个推荐规范来适应你的环境。

限制

但是,这并不是一个详细的“工作站加固”文档,可以说这是一个努力避免大多数明显安全错误而不会导致太多不便的一组推荐 基线 baseline 。你也许阅读这个文档后会认为它的方法太偏执,而另一些人也许会认为这仅仅是一些肤浅的研究。安全就像在高速公路上开车 -- 任何比你开的慢的都是一个傻瓜,然而任何比你开的快的人都是疯子。这个指南仅仅是一些列核心安全规则,既不详细又不能替代经验、警惕和常识。

我们分享这篇文档是为了将开源协作的优势带到 IT 策略文献资料中。如果你发现它有用,我们希望你可以将它用到你自己团体中,并分享你的改进,对它的完善做出你的贡献。

结构

每一节都分为两个部分:

  • 核对适合你项目的需求
  • 形式不定的提示内容,解释了为什么这么做

严重级别

在清单的每一个项目都包括严重级别,我们希望这些能帮助指导你的决定:

  • 关键(ESSENTIAL) 该项应该在考虑列表上被明确的重视。如果不采取措施,将会导致你的平台安全出现高风险。
  • 中等(NICE) 该项将改善你的安全形势,但是会影响到你的工作环境的流程,可能会要求养成新的习惯,改掉旧的习惯。
  • 低等(PARANOID) 留作感觉会明显完善我们平台安全、但是可能会需要大量调整与操作系统交互的方式的项目。

记住,这些只是参考。如果你觉得这些严重级别不能反映你的工程对安全的承诺,你应该调整它们为你所合适的。

选择正确的硬件

我们并不会要求管理员使用一个特殊供应商或者一个特殊的型号,所以这一节提供的是选择工作系统时的核心注意事项。

检查清单

  • [ ] 系统支持 安全启动 SecureBoot (关键)
  • [ ] 系统没有 火线 Firewire 雷电 thunderbolt 或者 扩展卡 ExpressCard 接口 (中等)
  • [ ] 系统有 TPM 芯片 (中等)

注意事项

安全启动 SecureBoot

尽管它还有争议,但是安全引导能够预防很多针对工作站的攻击(Rootkits、“Evil Maid”,等等),而没有太多额外的麻烦。它并不能阻止真正专门的攻击者,加上在很大程度上,国家安全机构有办法应对它(可能是通过设计),但是有安全引导总比什么都没有强。

作为选择,你也许可以部署 Anti Evil Maid 提供更多健全的保护,以对抗安全引导所需要阻止的攻击类型,但是它需要更多部署和维护的工作。

系统没有 火线 Firewire 雷电 thunderbolt 或者 扩展卡 ExpressCard 接口

火线是一个标准,其设计上允许任何连接的设备能够完全地直接访问你的系统内存(参见维基百科)。雷电接口和扩展卡同样有问题,虽然一些后来部署的雷电接口试图限制内存访问的范围。如果你没有这些系统端口,那是最好的,但是它并不严重,它们通常可以通过 UEFI 关闭或内核本身禁用。

TPM 芯片

可信平台模块 Trusted Platform Module ,TPM 是主板上的一个与核心处理器单独分开的加密芯片,它可以用来增加平台的安全性(比如存储全盘加密的密钥),不过通常不会用于日常的平台操作。充其量,这个是一个有则更好的东西,除非你有特殊需求,需要使用 TPM 增加你的工作站安全性。

预引导环境

这是你开始安装操作系统前的一系列推荐规范。

检查清单

  • [ ] 使用 UEFI 引导模式(不是传统 BIOS)(关键)
  • [ ] 进入 UEFI 配置需要使用密码 (关键)
  • [ ] 使用安全引导 (关键)
  • [ ] 启动系统需要 UEFI 级别密码 (中等)

注意事项

UEFI 和安全引导

UEFI 尽管有缺点,还是提供了很多传统 BIOS 没有的好功能,比如安全引导。大多数现代的系统都默认使用 UEFI 模式。

确保进入 UEFI 配置模式要使用高强度密码。注意,很多厂商默默地限制了你使用密码长度,所以相比长口令你也许应该选择高熵值的短密码(关于密码短语请参考下面内容)。

基于你选择的 Linux 发行版,你也许需要、也许不需要按照 UEFI 的要求,来导入你的发行版的安全引导密钥,从而允许你启动该发行版。很多发行版已经与微软合作,用大多数厂商所支持的密钥给它们已发布的内核签名,因此避免了你必须处理密钥导入的麻烦。

作为一个额外的措施,在允许某人访问引导分区然后尝试做一些不好的事之前,让他们输入密码。为了防止 肩窥 shoulder-surfing ,这个密码应该跟你的 UEFI 管理密码不同。如果你经常关闭和启动,你也许不想这么麻烦,因为你已经必须输入 LUKS 密码了(LUKS 参见下面内容),这样会让你您减少一些额外的键盘输入。

发行版选择注意事项

很有可能你会坚持一个广泛使用的发行版如 Fedora,Ubuntu,Arch,Debian,或它们的一个类似发行版。无论如何,以下是你选择使用发行版应该考虑的。

检查清单

  • [ ] 拥有一个强健的 MAC/RBAC 系统(SELinux/AppArmor/Grsecurity) (关键)
  • [ ] 发布安全公告 (关键)
  • [ ] 提供及时的安全补丁 (关键)
  • [ ] 提供软件包的加密验证 (关键)
  • [ ] 完全支持 UEFI 和安全引导 (关键)
  • [ ] 拥有健壮的原生全磁盘加密支持 (关键)

注意事项

SELinux,AppArmor,和 GrSecurity/PaX

强制访问控制 Mandatory Access Controls,MAC 或者 基于角色的访问控制 Role-Based Access Controls,RBAC 是一个用在老式 POSIX 系统的基于用户或组的安全机制扩展。现在大多数发行版已经捆绑了 MAC/RBAC 系统(Fedora,Ubuntu),或通过提供一种机制一个可选的安装后步骤来添加它(Gentoo,Arch,Debian)。显然,强烈建议您选择一个预装 MAC/RBAC 系统的发行版,但是如果你对某个没有默认启用它的发行版情有独钟,装完系统后应计划配置安装它。

应该坚决避免使用不带任何 MAC/RBAC 机制的发行版,像传统的 POSIX 基于用户和组的安全在当今时代应该算是考虑不足。如果你想建立一个 MAC/RBAC 工作站,通常认为 AppArmor 和 PaX 比 SELinux 更容易掌握。此外,在工作站上,很少有或者根本没有对外监听的守护进程,而针对用户运行的应用造成的最高风险,GrSecurity/PaX 可能 会比SELinux 提供更多的安全便利。

发行版安全公告

大多数广泛使用的发行版都有一个给它们的用户发送安全公告的机制,但是如果你对一些机密感兴趣,去看看开发人员是否有见于文档的提醒用户安全漏洞和补丁的机制。缺乏这样的机制是一个重要的警告信号,说明这个发行版不够成熟,不能被用作主要管理员的工作站。

及时和可靠的安全更新

多数常用的发行版提供定期安全更新,但应该经常检查以确保及时提供关键包更新。因此应避免使用 附属发行版 spin-off 和“社区重构”,因为它们必须等待上游发行版先发布,它们经常延迟发布安全更新。

现在,很难找到一个不使用加密签名、更新元数据或二者都不使用的发行版。如此说来,常用的发行版在引入这个基本安全机制就已经知道这些很多年了(Arch,说你呢),所以这也是值得检查的。

发行版支持 UEFI 和安全引导

检查发行版是否支持 UEFI 和安全引导。查明它是否需要导入额外的密钥或是否要求启动内核有一个已经被系统厂商信任的密钥签名(例如跟微软达成合作)。一些发行版不支持 UEFI 或安全启动,但是提供了替代品来确保 防篡改 tamper-proof 防破坏 tamper-evident 引导环境(Qubes-OS 使用 Anti Evil Maid,前面提到的)。如果一个发行版不支持安全引导,也没有防止引导级别攻击的机制,还是看看别的吧。

全磁盘加密

全磁盘加密是保护静止数据的要求,大多数发行版都支持。作为一个选择方案,带有自加密硬盘的系统也可以用(通常通过主板 TPM 芯片实现),并提供了类似安全级别而且操作更快,但是花费也更高。

发行版安装指南

所有发行版都是不同的,但是也有一些一般原则:

检查清单

  • [ ] 使用健壮的密码全磁盘加密(LUKS) (关键)
  • [ ] 确保交换分区也加密了 (关键)
  • [ ] 确保引导程序设置了密码(可以和LUKS一样) (关键)
  • [ ] 设置健壮的 root 密码(可以和LUKS一样) (关键)
  • [ ] 使用无特权账户登录,作为管理员组的一部分 (关键)
  • [ ] 设置健壮的用户登录密码,不同于 root 密码 (关键)

注意事项

全磁盘加密

除非你正在使用自加密硬盘,配置你的安装程序完整地加密所有存储你的数据与系统文件的磁盘很重要。简单地通过自动挂载的 cryptfs loop 文件加密用户目录还不够(说你呢,旧版 Ubuntu),这并没有给系统二进制文件或交换分区提供保护,它可能包含大量的敏感数据。推荐的加密策略是加密 LVM 设备,以便在启动过程中只需要一个密码。

/boot分区将一直保持非加密,因为引导程序需要在调用 LUKS/dm-crypt 前能引导内核自身。一些发行版支持加密的/boot分区,比如 Arch,可能别的发行版也支持,但是似乎这样增加了系统更新的复杂度。如果你的发行版并没有原生支持加密/boot也不用太在意,内核镜像本身并没有什么隐私数据,它会通过安全引导的加密签名检查来防止被篡改。

选择一个好密码

现代的 Linux 系统没有限制密码口令长度,所以唯一的限制是你的偏执和倔强。如果你要启动你的系统,你将大概至少要输入两个不同的密码:一个解锁 LUKS ,另一个登录,所以长密码将会使你老的更快。最好从丰富或混合的词汇中选择2-3个单词长度,容易输入的密码。

优秀密码例子(是的,你可以使用空格):

  • nature abhors roombas
  • 12 in-flight Jebediahs
  • perdon, tengo flatulence

如果你喜欢输入可以在公开场合和你生活中能见到的句子,比如:

  • Mary had a little lamb
  • you're a wizard, Harry
  • to infinity and beyond

如果你愿意的话,你也应该带上最少要 10-12个字符长度的非词汇的密码。

除非你担心物理安全,你可以写下你的密码,并保存在一个远离你办公桌的安全的地方。

Root,用户密码和管理组

我们建议,你的 root 密码和你的 LUKS 加密使用同样的密码(除非你共享你的笔记本给信任的人,让他应该能解锁设备,但是不应该能成为 root 用户)。如果你是笔记本电脑的唯一用户,那么你的 root 密码与你的 LUKS 密码不同是没有安全优势上的意义的。通常,你可以使用同样的密码在你的 UEFI 管理,磁盘加密,和 root 登录中 -- 知道这些任意一个都会让攻击者完全控制您的系统,在单用户工作站上使这些密码不同,没有任何安全益处。

你应该有一个不同的,但同样强健的常规用户帐户密码用来日常工作。这个用户应该是管理组用户(例如wheel或者类似,根据发行版不同),允许你执行sudo来提升权限。

换句话说,如果在你的工作站只有你一个用户,你应该有两个独特的、 强健 robust 强壮 strong 的密码需要记住:

管理级别,用在以下方面:

  • UEFI 管理
  • 引导程序(GRUB)
  • 磁盘加密(LUKS)
  • 工作站管理(root 用户)

用户级别,用在以下:

  • 用户登录和 sudo
  • 密码管理器的主密码

很明显,如果有一个令人信服的理由的话,它们全都可以不同。

安装后的加固

安装后的安全加固在很大程度上取决于你选择的发行版,所以在一个像这样的通用文档中提供详细说明是徒劳的。然而,这里有一些你应该采取的步骤:

检查清单

  • [ ] 在全局范围内禁用火线和雷电模块 (关键)
  • [ ] 检查你的防火墙,确保过滤所有传入端口 (关键)
  • [ ] 确保 root 邮件转发到一个你可以收到的账户 (关键)
  • [ ] 建立一个系统自动更新任务,或更新提醒 (中等)
  • [ ] 检查以确保 sshd 服务默认情况下是禁用的 (中等)
  • [ ] 配置屏幕保护程序在一段时间的不活动后自动锁定 (中等)
  • [ ] 设置 logwatch (中等)
  • [ ] 安装使用 rkhunter (中等)
  • [ ] 安装一个 入侵检测系统 Intrusion Detection System (中等)

注意事项

将模块列入黑名单

将火线和雷电模块列入黑名单,增加一行到/etc/modprobe.d/blacklist-dma.conf文件:

blacklist firewire-core
blacklist thunderbolt

重启后的这些模块将被列入黑名单。这样做是无害的,即使你没有这些端口(但也不做任何事)。

Root 邮件

默认的 root 邮件只是存储在系统基本上没人读过。确保你设置了你的/etc/aliases来转发 root 邮件到你确实能读取的邮箱,否则你也许错过了重要的系统通知和报告:

# Person who should get root's mail
root:          [email protected]

编辑后这些后运行newaliases,然后测试它确保能投递到,像一些邮件供应商将拒绝来自不存在的域名或者不可达的域名的邮件。如果是这个原因,你需要配置邮件转发直到确实可用。

防火墙,sshd,和监听进程

默认的防火墙设置将取决于您的发行版,但是大多数都允许sshd端口连入。除非你有一个令人信服的合理理由允许连入 ssh,你应该过滤掉它,并禁用 sshd 守护进程。

systemctl disable sshd.service
systemctl stop sshd.service

如果你需要使用它,你也可以临时启动它。

通常,你的系统不应该有任何侦听端口,除了响应 ping 之外。这将有助于你对抗网络级的零日漏洞利用。

自动更新或通知

建议打开自动更新,除非你有一个非常好的理由不这么做,如果担心自动更新将使您的系统无法使用(以前发生过,所以这种担心并非杞人忧天)。至少,你应该启用自动通知可用的更新。大多数发行版已经有这个服务自动运行,所以你不需要做任何事。查阅你的发行版文档了解更多。

你应该尽快应用所有明显的勘误,即使这些不是特别贴上“安全更新”或有关联的 CVE 编号。所有的问题都有潜在的安全漏洞和新的错误,比起停留在旧的、已知的问题上,未知问题通常是更安全的策略。

监控日志

你应该会对你的系统上发生了什么很感兴趣。出于这个原因,你应该安装logwatch然后配置它每夜发送在你的系统上发生的任何事情的活动报告。这不会预防一个专业的攻击者,但是一个不错的安全网络功能。

注意,许多 systemd 发行版将不再自动安装一个“logwatch”所需的 syslog 服务(因为 systemd 会放到它自己的日志中),所以你需要安装和启用“rsyslog”来确保在使用 logwatch 之前你的 /var/log 不是空的。

Rkhunter 和 IDS

安装rkhunter和一个类似aide或者tripwire入侵检测系统(IDS)并不是那么有用,除非你确实理解它们如何工作,并采取必要的步骤来设置正确(例如,保证数据库在外部介质,从可信的环境运行检测,记住执行系统更新和配置更改后要刷新散列数据库,等等)。如果你不愿在你的工作站执行这些步骤,并调整你如何工作的方式,这些工具只能带来麻烦而没有任何实在的安全益处。

我们建议你安装rkhunter并每晚运行它。它相当易于学习和使用,虽然它不会阻止一个复杂的攻击者,它也能帮助你捕获你自己的错误。

个人工作站备份

工作站备份往往被忽视,或偶尔才做一次,这常常是不安全的方式。

检查清单

  • [ ] 设置加密备份工作站到外部存储 (关键)
  • [ ] 使用 零认知 zero-knowledge 备份工具备份到站外或云上 (中等)

注意事项

全加密的备份存到外部存储

把全部备份放到一个移动磁盘中比较方便,不用担心带宽和上行网速(在这个时代,大多数供应商仍然提供显著的不对称的上传/下载速度)。不用说,这个移动硬盘本身需要加密(再说一次,通过 LUKS),或者你应该使用一个备份工具建立加密备份,例如duplicity或者它的 GUI 版本 deja-dup。我建议使用后者并使用随机生成的密码,保存到离线的安全地方。如果你带上笔记本去旅行,把这个磁盘留在家,以防你的笔记本丢失或被窃时可以找回备份。

除了你的家目录外,你还应该备份/etc目录和出于取证目的的/var/log目录。

尤其重要的是,避免拷贝你的家目录到任何非加密存储上,即使是需要快速的在两个系统上移动文件时,一旦完成你肯定会忘了清除它,从而暴露个人隐私或者安全信息到监听者手中 -- 尤其是把这个存储介质跟你的笔记本放到同一个包里。

有选择的零认知站外备份

站外备份 Off-site backup 也是相当重要的,是否可以做到要么需要你的老板提供空间,要么找一家云服务商。你可以建一个单独的 duplicity/deja-dup 配置,只包括重要的文件,以免传输大量你不想备份的数据(网络缓存、音乐、下载等等)。

作为选择,你可以使用 零认知 zero-knowledge 备份工具,例如 SpiderOak,它提供一个卓越的 Linux GUI工具还有更多的实用特性,例如在多个系统或平台间同步内容。

最佳实践

下面是我们认为你应该采用的最佳实践列表。它当然不是非常详细的,而是试图提供实用的建议,来做到可行的整体安全性和可用性之间的平衡。

浏览

毫无疑问, web 浏览器将是你的系统上最大、最容易暴露的面临攻击的软件。它是专门下载和执行不可信、甚至是恶意代码的一个工具。它试图采用沙箱和 代码清洁 code sanitization 等多种机制保护你免受这种危险,但是在之前它们都被击败了多次。你应该知道,在任何时候浏览网站都是你做的最不安全的活动。

有几种方法可以减少浏览器的影响,但这些真实有效的方法需要你明显改变操作您的工作站的方式。

1: 使用两个不同的浏览器 (关键)

这很容易做到,但是只有很少的安全效益。并不是所有浏览器都可以让攻击者完全自由访问您的系统 -- 有时它们只能允许某人读取本地浏览器存储,窃取其它标签的活动会话,捕获浏览器的输入等。使用两个不同的浏览器,一个用在工作/高安全站点,另一个用在其它方面,有助于防止攻击者请求整个 cookie 存储的小问题。主要的不便是两个不同的浏览器会消耗大量内存。

我们建议:

火狐用来访问工作和高安全站点

使用火狐登录工作有关的站点,应该额外关心的是确保数据如 cookies,会话,登录信息,击键等等,明显不应该落入攻击者手中。除了少数的几个网站,你不应该用这个浏览器访问其它网站。

你应该安装下面的火狐扩展:

  • [ ] NoScript (关键)
+ NoScript 阻止活动内容加载,除非是在用户白名单里的域名。如果用于默认浏览器它会很麻烦(可是提供了真正好的安全效益),所以我们建议只在访问与工作相关的网站的浏览器上开启它。
  • [ ] Privacy Badger (关键)
+ EFF 的 Privacy Badger 将在页面加载时阻止大多数外部追踪器和广告平台,有助于在这些追踪站点影响你的浏览器时避免跪了(追踪器和广告站点通常会成为攻击者的目标,因为它们能会迅速影响世界各地成千上万的系统)。
  • [ ] HTTPS Everywhere (关键)
+ 这个 EFF 开发的扩展将确保你访问的大多数站点都使用安全连接,甚至你点击的连接使用的是 <http://(可以有效的避免大多数的攻击,例如> [SSL-strip](http://www.thoughtcrime.org/software/sslstrip/))。
  • [ ] Certificate Patrol (中等)
+ 如果你正在访问的站点最近改变了它们的 TLS 证书,这个工具将会警告你 -- 特别是如果不是接近失效期或者现在使用不同的证书颁发机构。它有助于警告你是否有人正尝试中间人攻击你的连接,不过它会产生很多误报。

你应该让火狐成为你打开连接时的默认浏览器,因为 NoScript 将在加载或者执行时阻止大多数活动内容。

其它一切都用 Chrome/Chromium

Chromium 开发者在增加很多很好的安全特性方面走在了火狐前面(至少在 Linux 上),例如 seccomp 沙箱,内核用户空间等等,这会成为一个你访问的网站与你其它系统之间的额外隔离层。Chromium 是上游开源项目,Chrome 是 Google 基于它构建的专有二进制包(加一句偏执的提醒,如果你有任何不想让谷歌知道的事情都不要使用它)。

推荐你在 Chrome 上也安装Privacy BadgerHTTPS Everywhere 扩展,然后给它一个与火狐不同的主题,以让它告诉你这是你的“不可信站点”浏览器。

2: 使用两个不同浏览器,一个在专用的虚拟机里 (中等)

这有点像上面建议的做法,除了您将添加一个通过快速访问协议运行在专用虚拟机内部 Chrome 的额外步骤,它允许你共享剪贴板和转发声音事件(如,Spice 或 RDP)。这将在不可信浏览器和你其它的工作环境之间添加一个优秀的隔离层,确保攻击者完全危害你的浏览器将必须另外打破 VM 隔离层,才能达到系统的其余部分。

这是一个鲜为人知的可行方式,但是需要大量的 RAM 和高速的处理器来处理多增加的负载。这要求作为管理员的你需要相应地调整自己的工作实践而付出辛苦。

3: 通过虚拟化完全隔离你的工作和娱乐环境 (低等)

了解下 Qubes-OS 项目,它致力于通过划分你的应用到完全隔离的 VM 中来提供高度安全的工作环境。

密码管理器

检查清单

  • [ ] 使用密码管理器 (关键)
  • [ ] 不相关的站点使用不同的密码 (关键)
  • [ ] 使用支持团队共享的密码管理器 (中等)
  • [ ] 给非网站类账户使用一个单独的密码管理器 (低等)

注意事项

使用好的、唯一的密码对你的团队成员来说应该是非常关键的需求。 凭证 credential 盗取一直在发生 — 通过被攻破的计算机、盗取数据库备份、远程站点利用、以及任何其它的方式。凭证绝不应该跨站点重用,尤其是关键的应用。

浏览器中的密码管理器

每个浏览器有一个比较安全的保存密码机制,可以同步到供应商维护的,并使用用户的密码保证数据加密。然而,这个机制有严重的劣势:

  1. 不能跨浏览器工作
  2. 不提供任何与团队成员共享凭证的方法

也有一些支持良好、免费或便宜的密码管理器,可以很好的融合到多个浏览器,跨平台工作,提供小组共享(通常是付费服务)。可以很容易地通过搜索引擎找到解决方案。

独立的密码管理器

任何与浏览器结合的密码管理器都有一个主要的缺点,它实际上是应用的一部分,这样最有可能被入侵者攻击。如果这让你不放心(应该这样),你应该选择两个不同的密码管理器 -- 一个集成在浏览器中用来保存网站密码,一个作为独立运行的应用。后者可用于存储高风险凭证如 root 密码、数据库密码、其它 shell 账户凭证等。

这样的工具在团队成员间共享超级用户的凭据方面特别有用(服务器 root 密码、ILO密码、数据库管理密码、引导程序密码等等)。

这几个工具可以帮助你:

  • KeePassX,在第2版中改进了团队共享
  • Pass,它使用了文本文件和 PGP,并与 git 结合
  • Django-Pstore,它使用 GPG 在管理员之间共享凭据
  • Hiera-Eyaml,如果你已经在你的平台中使用了 Puppet,在你的 Hiera 加密数据的一部分里面,可以便捷的追踪你的服务器/服务凭证。

加固 SSH 与 PGP 的私钥

个人加密密钥,包括 SSH 和 PGP 私钥,都是你工作站中最重要的物品 -- 这是攻击者最想得到的东西,这可以让他们进一步攻击你的平台或在其它管理员面前冒充你。你应该采取额外的步骤,确保你的私钥免遭盗窃。

检查清单

  • [ ] 用来保护私钥的强壮密码 (关键)
  • [ ] PGP 的主密码保存在移动存储中 (中等)
  • [ ] 用于身份验证、签名和加密的子密码存储在智能卡设备 (中等)
  • [ ] SSH 配置为以 PGP 认证密钥作为 ssh 私钥 (中等)

注意事项

防止私钥被偷的最好方式是使用一个智能卡存储你的加密私钥,绝不要拷贝到工作站上。有几个厂商提供支持 OpenPGP 的设备:

  • Kernel Concepts,在这里可以采购支持 OpenPGP 的智能卡和 USB 读取器,你应该需要一个。
  • Yubikey NEO,这里提供 OpenPGP 功能的智能卡还提供很多很酷的特性(U2F、PIV、HOTP等等)。

确保 PGP 主密码没有存储在工作站也很重要,仅使用子密码。主密钥只有在签名其它的密钥和创建新的子密钥时使用 — 不经常发生这种操作。你可以照着 Debian 的子密钥向导来学习如何将你的主密钥移动到移动存储并创建子密钥。

你应该配置你的 gnupg 代理作为 ssh 代理,然后使用基于智能卡 PGP 认证密钥作为你的 ssh 私钥。我们发布了一个详尽的指导如何使用智能卡读取器或 Yubikey NEO。

如果你不想那么麻烦,最少要确保你的 PGP 私钥和你的 SSH 私钥有个强健的密码,这将让攻击者很难盗取使用它们。

休眠或关机,不要挂起

当系统挂起时,内存中的内容仍然保留在内存芯片中,可以会攻击者读取到(这叫做 冷启动攻击 Cold Boot Attack )。如果你离开你的系统的时间较长,比如每天下班结束,最好关机或者休眠,而不是挂起它或者就那么开着。

工作站上的 SELinux

如果你使用捆绑了 SELinux 的发行版(如 Fedora),这有些如何使用它的建议,让你的工作站达到最大限度的安全。

检查清单

  • [ ] 确保你的工作站 强制 enforcing 使用 SELinux (关键)
  • [ ] 不要盲目的执行audit2allow -M,应该经常检查 (关键)
  • [ ] 绝不要 setenforce 0 (中等)
  • [ ] 切换你的用户到 SELinux 用户staff_u (中等)

注意事项

SELinux 是 强制访问控制 Mandatory Access Controls,MAC ,是 POSIX许可核心功能的扩展。它是成熟、强健,自从它推出以来已经有很长的路了。不管怎样,许多系统管理员现在仍旧重复过时的口头禅“关掉它就行”。

话虽如此,在工作站上 SELinux 会带来一些有限的安全效益,因为大多数你想运行的应用都是可以自由运行的。开启它有益于给网络提供足够的保护,也有可能有助于防止攻击者通过脆弱的后台服务提升到 root 级别的权限用户。

我们的建议是开启它并 强制使用 enforcing

绝不setenforce 0

使用setenforce 0临时把 SELinux 设置为 许可 permissive 模式很有诱惑力,但是你应该避免这样做。当你想查找一个特定应用或者程序的问题时,实际上这样做是把整个系统的 SELinux 给关闭了。

你应该使用semanage permissive -a [somedomain_t]替换setenforce 0,只把这个程序放入许可模式。首先运行ausearch查看哪个程序发生问题:

ausearch -ts recent -m avc

然后看下scontext=(源自 SELinux 的上下文)行,像这样:

scontext=staff_u:staff_r:gpg_pinentry_t:s0-s0:c0.c1023
                         ^^^^^^^^^^^^^^

这告诉你程序gpg_pinentry_t被拒绝了,所以你想排查应用的故障,应该增加它到许可域:

semange permissive -a gpg_pinentry_t

这将允许你使用应用然后收集 AVC 的其它数据,你可以结合audit2allow来写一个本地策略。一旦完成你就不会看到新的 AVC 的拒绝消息,你就可以通过运行以下命令从许可中删除程序:

semanage permissive -d gpg_pinentry_t
用 SELinux 的用户 staff\_r 使用你的工作站

SELinux 带有 角色 role 的原生实现,基于用户帐户相关角色来禁止或授予某些特权。作为一个管理员,你应该使用staff_r角色,这可以限制访问很多配置和其它安全敏感文件,除非你先执行sudo

默认情况下,用户以unconfined_r创建,你可以自由运行大多数应用,没有任何(或只有一点)SELinux 约束。转换你的用户到staff_r角色,运行下面的命令:

usermod -Z staff_u [username]

你应该退出然后登录新的角色,届时如果你运行id -Z,你将会看到:

staff_u:staff_r:staff_t:s0-s0:c0.c1023

在执行sudo时,你应该记住增加一个额外标志告诉 SELinux 转换到“sysadmin”角色。你需要用的命令是:

sudo -i -r sysadm_r

然后id -Z将会显示:

staff_u:sysadm_r:sysadm_t:s0-s0:c0.c1023

警告:在进行这个切换前你应该能很顺畅的使用ausearchaudit2allow,当你以staff_r角色运行时你的应用有可能不再工作了。在写作本文时,已知以下流行的应用在staff_r下没有做策略调整就不会工作:

  • Chrome/Chromium
  • Skype
  • VirtualBox

切换回unconfined_r,运行下面的命令:

usermod -Z unconfined_u [username]

然后注销再重新回到舒适区。

延伸阅读

IT 安全的世界是一个没有底的兔子洞。如果你想深入,或者找到你的具体发行版更多的安全特性,请查看下面这些链接:

许可

这项工作在创作共用授权4.0国际许可证许可下。


via: https://github.com/lfit/itpol/blob/bbc17d8c69cb8eee07ec41f8fbf8ba32fdb4301b/linux-workstation-security.md

作者:mricon 译者:wyangsun 校对:wxy

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