2015年5月

今天,我们来学习一下在 CentOS 7.x 中如何用 nmcli(Network Manager Command Line Interface:网络管理命令行接口)进行网卡绑定。

网卡(接口)绑定是将多块 网卡 逻辑地连接到一起从而允许故障转移或者提高吞吐率的方法。提高服务器网络可用性的一个方式是使用多个网卡。Linux 绑定驱动程序提供了一种将多个网卡聚合到一个逻辑的绑定接口的方法。这是个新的实现绑定的方法,并不影响 linux 内核中旧绑定驱动。

网卡绑定为我们提供了两个主要的好处:

  1. 高带宽
  2. 冗余/弹性

现在让我们在 CentOS 7 上配置网卡绑定吧。我们需要决定选取哪些接口配置成一个组接口(Team interface)。

运行 ip link 命令查看系统中可用的接口。

 $ ip link

ip link

这里我们使用 eno16777736eno33554960 网卡在 “主动备份” 模式下创建一个组接口。(译者注:关于不同模式可以参考:多网卡的7种bond模式原理)

按照下面的语法,用 nmcli 命令为网络组接口创建一个连接。

# nmcli con add type team con-name CNAME ifname INAME [config JSON]

CNAME 指代连接的名称,INAME 是接口名称,JSON (JavaScript Object Notation) 指定所使用的处理器(runner)。JSON 语法格式如下:

'{"runner":{"name":"METHOD"}}' 

METHOD 是以下的其中一个:broadcast、activebackup、roundrobin、loadbalance 或者 lacp

1. 创建组接口

现在让我们来创建组接口。这是我们创建组接口所使用的命令。

 # nmcli con add type team con-name team0 ifname team0 config '{"runner":{"name":"activebackup"}}'

nmcli con create

运行 # nmcli con show 命令验证组接口配置。

# nmcli con show

显示组接口

2. 添加从设备

现在让我们添加从设备到主设备 team0。这是添加从设备的语法:

# nmcli con add type team-slave con-name CNAME ifname INAME master TEAM

在这里我们添加 eno16777736eno33554960 作为 team0 接口的从设备。

# nmcli con add type team-slave con-name team0-port1 ifname eno16777736 master team0

# nmcli con add type team-slave con-name team0-port2 ifname eno33554960 master team0

添加从设备到 team

再次用命令 #nmcli con show 验证连接配置。现在我们可以看到从设备配置信息。

#nmcli con show

显示从设备配置

3. 分配 IP 地址

上面的命令会在 /etc/sysconfig/network-scripts/ 目录下创建需要的配置文件。

现在让我们为 team0 接口分配一个 IP 地址并启用这个连接。这是进行 IP 分配的命令。

# nmcli con mod team0 ipv4.addresses "192.168.1.24/24 192.168.1.1"
# nmcli con mod team0 ipv4.method manual
# nmcli con up team0

分配 ip

4. 验证绑定

#ip add show team0 命令验证 IP 地址信息。

#ip add show team0

验证 ip 地址

现在用 teamdctl 命令检查 主动备份 配置功能。

# teamdctl team0 state

teamdctl 检查主动备份

现在让我们把激活的端口断开连接并再次检查状态来确认主动备份配置是否像希望的那样工作。

# nmcli dev dis eno33554960

断开激活端口连接

断开激活端口后再次用命令 #teamdctl team0 state 检查状态。

# teamdctl team0 state

teamdctl 检查断开激活端口连接

是的,它运行良好!!我们会使用下面的命令连接回到 team0 的断开的连接。

#nmcli dev con eno33554960

nmcli dev 连接断开的连接

我们还有一个 teamnl 命令可以显示 teamnl 命令的一些选项。

用下面的命令检查在 team0 运行的端口。

# teamnl team0 ports

teamnl 检查端口

显示 team0 当前活动的端口。

# teamnl team0 getoption activeport

显示 team0 活动端口

好了,我们已经成功地配置了网卡绑定 :-) ,如果有任何反馈,请告诉我们。


via: http://linoxide.com/linux-command/interface-nics-bonding-linux/

作者:Arun Pyasi 译者:ictlyh 校对:wxy

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

Budgie是为Linux发行版定制的旗舰桌面,也是一个定制工程。为思想前卫的用户设计,致力于简单和简洁。它的一个巨大优势是它不是别的项目的fork版本,是从都到尾都独立的。

Budgie 桌面环境

Budgie桌面与GNOME栈紧密结合,使用先进的技术从而提供一个可选择的桌面体验。出于开源理念,这个桌面之后也能在别的Linux发行版中看到。

现在Budgie能够通过面板的设置达到和GNOME2桌面相似的使用体验。

0.8版的特点

  • 任务栏:支持应用锁定到任务栏
  • 任务栏:使用.desktop文件来配置quicklists菜单
  • 任务栏:使用.desktop文件来配置图标分辨率
  • 任务栏:支持有通知时蓝色闪烁
  • 面板:支持默认深色主体
  • 添加菜单条的小组件
  • 面板:自动隐藏菜单条和工具条(这配置为手动)
  • 面板:支持屏幕边缘处阴影
  • 面板:动态支持gnome面板主题
  • 运行对话框:虚拟刷新
  • Budgie菜单: 增加紧凑模式,并默认采用
  • Budgie菜单: 按照使用顺序排列菜单项
  • Budgie菜单: 移除旧的电源选项
  • 编辑器: 在UI中增加所有的菜单选项
  • 支持从GNOME 3.10 升级到3.16
  • wm: 关闭工作区的动画(v8之后)
  • wm: 改变壁纸时更好的动画

重要信息

  • Budgie 0.8版发行版目前只是beta
  • 无本地网络管理;可以通过使用ubuntu的小组件解决
  • Budgie 是为Evolve OS设计的,因此这个PPA可能会有bug
  • GNOME 主题比Ubuntu本地的主题效果更好
  • Ubuntu的滚动栏将不在工作
  • 如果你想了解的更多可以访问Evolve OS网站

安装

现在,我们将在Ubuntu14.04 LTS中安装我们自己的轻量级Budgie桌面。首先,我们要把PPA源添加到我们的Ubuntu中。执行以下命令:

$ sudo add-apt-repository ppa:evolve-os/ppa

添加Budgie的ppa源

添加完ppa之后,运行下面的命令更新本地软件仓库。

$ sudo apt-get update

然后只要执行下面的命令安装

$ sudo apt-get install budgie-desktop

安装 Budgie Desktop

注意

这是一个活跃的开发版本,一些主要的功能可能还不是特别的完善,如:没有网络管理器,没有音量控制组件(可以使用键盘控制),无通知系统并且无法将app锁定到任务栏。

有一个临时解决方案可以禁用叠加滚动栏:设置另外一个默认主题,然后从终端退出当前会话:

$ gnome-session-quit

退出 Gnome 会话

登录Budgie会话

安装完成之后,我们能在登录时选择进入budgie桌面。

选择桌面会话

注销当前用户

$ budgie-sessioon --logout

结论

嗨,现在我们已经成功的在 Ubuntu 14.04 LTS 上安装了轻量级 Budgie 桌面环境。Budgie桌面当前正在开发过程中,因此有目前有很多功能的缺失。虽然它是基于Gnome 的 GTK3,但不是完全的复制。Budgie是完全从零开始实现,它的设计是优雅的并且正在不断的完善。如果你有任何问题、评论,请在下面的评论框发表。愿你喜欢 Budgie 桌面 0.8 。


via: http://linoxide.com/ubuntu-how-to/install-lightweight-budgie-v8-desktop-ubuntu/

作者:Arun Pyasi 译者:johnhoow 校对:wxy

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

热门竞速类游戏 SuperTuxKart 的新版本已经打包发行登陆下载服务器

Super Tux Kart 0.9 发行海报

SuperTuxKart 0.9 相较前一版本做了巨大的升级,内部运行着刚出炉的新引擎(有个炫酷的名字叫‘Antarctica(南极洲)’),目的是要呈现更加炫酷的图形环境,从阴影到场景的纵深,外加卡丁车更好的物理效果。

突出的图形表现也增加了对显卡的要求。SuperTuxKart 开发人员给玩家的建议是,要有图像处理能力比得上(或者,想要完美的话,要超过) Intel HD Graphics 3000, NVIDIA GeForce 8600 或 AMD Radeon HD 3650 的显卡。

其他改变

SuperTuxKart 0.9 中与图像的改善同样吸引人眼球的是一对全新赛道,新的卡丁车,新的在线账户可以记录和分享全新推出的成就系统里赢得的徽章,以及大量的改装和涂装的微调。

点击播放下面的官方发行视频,看看基于调色器的 STK 0.9 所散发的光辉吧。(youtube 视频:https://www.youtube.com/0FEwDH7XU9Q

Ubuntu 用户可以从项目网站上下载新发行版已编译的二进制文件。


via: http://www.omgubuntu.co.uk/2015/04/supertuxkart-0-9-released

作者:Joey-Elijah Sneddon 译者:H-mudcup 校对:wxy

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

[TL;DR] 这是系列的第二篇文章,这系列讲述了我的公司如何把基础服务从PaaS迁移到Docker上

  • 第一篇文章: 我谈到了接触Docker之前的经历;
  • 第三篇文章: 我展示如何使创建镜像的过程自动化以及如何用Docker部署一个Rails应用。

为什么需要搭建一个私有的registry呢?嗯,对于新手来说,Docker Hub(一个Docker公共仓库)只允许你拥有一个免费的私有版本库(repo)。其他的公司也开始提供类似服务,但是价格可不便宜。另外,如果你需要用Docker部署一个用于生产环境的应用,恐怕你不希望将这些镜像放在公开的Docker Hub上吧!

这篇文章提供了一个非常务实的方法来处理搭建私有Docker registry时出现的各种错综复杂的情况。我们将会使用一个运行于DigitalOcean(之后简称为DO)的非常小巧的512MB VPS 实例。并且我会假定你已经了解了Docker的基本概念,因为我必须集中精力在复杂的事情上!

本地搭建

首先你需要安装boot2docker以及docker CLI。如果你已经搭建好了基本的Docker环境,你可以直接跳过这一步。

从终端运行以下命令(我假设你使用OS X,使用 HomeBrew 来安装相关软件,你可以根据你的环境使用不同的包管理软件来安装):

brew install boot2docker docker  

如果一切顺利(想要了解搭建docker环境的完整指南,请参阅 http://boot2docker.io/) ,你现在就能够通过如下命令启动一个 Docker 运行于其中的虚拟机:

boot2docker up  

按照屏幕显示的说明,复制粘贴book2docker在终端输出的命令。如果你现在运行docker ps命令,终端将有以下显示。

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES  

好了,Docker已经准备就绪,这就够了,我们回过头去搭建registry。

创建服务器

登录进你的DO账号,选择一个预安装了Docker的镜像文件,创建一个新的Drople。(本文写成时选择的是 Image > Applications > Docker 1.4.1 on 14.04)

你将会以邮件的方式收到一个根用户凭证。登录进去,然后运行docker ps命令来查看系统状态。

搭建AWS S3

我们现在将使用Amazo Simple Storage Service(S3)作为我们registry/repository的存储层。我们将需要创建一个桶(bucket)以及用户凭证(user credentials)来允许我们的docker容器访问它。

登录到我们的AWS账号(如果没有,就申请一个http://aws.amazon.com/),在控制台选择S3(Simpole Storage Service)。

点击 Create Bucket,为你的桶输入一个名字(把它记下来,我们一会需要用到它),然后点击Create

OK!我们已经搭建好存储部分了。

设置AWS访问凭证

我们现在将要创建一个新的用户。退回到AWS控制台然后选择IAM(Identity & Access Management)。

在dashboard的左边,点击Users。然后选择 Create New Users

如图所示:

输入一个用户名(例如 docker-registry)然后点击Create。写下(或者下载csv文件)你的Access Key以及Secret Access Key。回到你的用户列表然后选择你刚刚创建的用户。

在Permission section下面,点击Attach User Policy。之后在下一屏,选择Custom Policy。

custom policy的内容如下:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "SomeStatement",
      "Effect": "Allow",
      "Action": [
        "s3:*"
      ],
      "Resource": [
        "arn:aws:s3:::docker-registry-bucket-name/*",       
        "arn:aws:s3:::docker-registry-bucket-name"
      ]
    }
  ]
}

这个配置将允许用户(也就是regitstry)来对桶上的内容进行操作(读/写)(确保使用你之前创建AWS S3时使用的桶名)。总结一下:当你想把你的Docker镜像从你的本机推送到仓库中时,服务器就会将他们上传到S3。

安装registry

现在回过头来看我们的DO服务器,SSH登录其上。我们将要使用一个官方Docker registry镜像

输入如下命令,开启registry。

docker run \  
         -e SETTINGS_FLAVOR=s3 \
         -e AWS_BUCKET=bucket-name \
         -e STORAGE_PATH=/registry \
         -e AWS_KEY=your_aws_key \
         -e AWS_SECRET=your_aws_secret \
         -e SEARCH_BACKEND=sqlalchemy \
         -p 5000:5000 \
         --name registry \
         -d \
         registry

Docker将会从Docker Hub上拉取所需的文件系统分层(fs layers)并启动守护容器(daemonised container)。

测试registry

如果上述操作奏效,你可以通过ping命令,或者查找它的内容来测试registry(虽然这个时候容器还是空的)。

我们的registry非常基础,而且没有提供任何“验明正身”的方式。因为添加身份验证可不是一件轻松事(至少我认为没有一种部署方法是简单的,像是为了证明你努力过似的),我觉得“查询/拉取/推送”仓库内容的最简单方法就是通过SSH通道的未加密连接(通过HTTP)。

打开SSH通道的操作非常简单:

ssh -N -L 5000:localhost:5000 root@your_registry.com

这条命令建立了一条从registry服务器(前面执行docker run命令的时候我们见过它)的5000号端口到本机的5000号端口之间的 SSH 管道连接。

如果你现在用浏览器访问 http://localhost:5000/v1/_ping,将会看到下面这个非常简短的回复。

{}

这个意味着registry工作正常。你还可以通过登录 http://localhost:5000/v1/search 来查看registry内容,内容相似:

{
  "num_results": 2,
  "query": "",
  "results": [
    {
      "description": "",
      "name": "username/first-repo"
    },
    {
      "description": "",
      "name": "username/second-repo"
    }
  ]
}

创建一个镜像

我们现在创建一个非常简单的Docker镜像,来检验我们新弄好的registry。在我们的本机上,用如下内容创建一个Dockerfile(这里只有一点代码,在下一篇文章里我将会展示给你如何将一个Rails应用绑定进Docker容器中。):

#  ruby 2.2.0 的基础镜像
FROM ruby:2.2.0

MAINTAINER Michelangelo Chasseur <[email protected]>  

并创建它:

docker build -t localhost:5000/username/repo-name .  

localhost:5000这个部分非常重要:Docker镜像名的最前面一个部分将告知docker push命令我们将要把我们的镜像推送到哪里。在我们这个例子当中,因为我们要通过SSH管道连接远程的私有registry,localhost:5000精确地指向了我们的registry。

如果一切顺利,当命令执行完成返回后,你可以输入docker images命令来列出新近创建的镜像。执行它看看会出现什么现象?

推送到仓库

接下来是更好玩的部分。实现我所描述的东西着实花了我一点时间,所以如果你第一次读的话就耐心一点吧,跟着我一起操作。我知道接下来的东西会非常复杂(如果你不自动化这个过程就一定会这样),但是我保证到最后你一定都能明白。在下一篇文章里我将会使用到一大波shell脚本和Rake任务,通过它们实现自动化并且用简单的命令实现部署Rails应用。

你在终端上运行的docker命令实际上都是使用boot2docker虚拟机来运行容器及各种东西。所以当你执行像docker push some_repo这样的命令时,是boot2docker虚拟机在与registry交互,而不是我们自己的机器。

接下来是一个非常重要的点:为了将Docker镜像推送到远端的私有仓库,SSH管道需要在boot2docker虚拟机上配置好,而不是在你的本地机器上配置。

有许多种方法实现它。我给你展示最简短的一种(可能不是最容易理解的,但是能够帮助你实现自动化)

在这之前,我们需要对 SSH 做最后一点工作。

设置 SSH

让我们把boot2docker 的 SSH key添加到远端服务器的“已知主机”里面。我们可以使用ssh-copy-id工具完成,通过下面的命令就可以安装上它了:

brew install ssh-copy-id  

然后运行:

ssh-copy-id -i /Users/username/.ssh/id_boot2docker [email protected]  

用你ssh key的真实路径代替/Users/username/.ssh/id_boot2docker

这样做能够让我们免密码登录SSH。

现在我们来测试以下:

boot2docker ssh "ssh -o 'StrictHostKeyChecking no' -i /Users/michelangelo/.ssh/id_boot2docker -N -L 5000:localhost:5000 [email protected] &" &  

分开阐述:

  • boot2docker ssh允许你以参数的形式传递给boot2docker虚拟机一条执行的命令;
  • 最后面那个&表明这条命令将在后台执行;
  • ssh -o 'StrictHostKeyChecking no' -i /Users/michelangelo/.ssh/id_boot2docker -N -L 5000:localhost:5000 [email protected] &是boot2docker虚拟机实际运行的命令;

    • -o 'StrictHostKeyChecking no'——不提示安全问题;
    • -i /Users/michelangelo/.ssh/id_boot2docker指出虚拟机使用哪个SSH key来进行身份验证。(注意这里的key应该是你前面添加到远程仓库的那个)
    • 最后我们将打开一条端口5000映射到localhost:5000的SSH通道。

从其他服务器上拉取

你现在将可以通过下面的简单命令将你的镜像推送到远端仓库:

docker push localhost:5000/username/repo_name  

在下一篇文章中,我们将会了解到如何自动化处理这些事务,并且真正地容器化一个Rails应用。请继续收听!

如有错误,请不吝指出。祝你Docker之路顺利!


via: http://cocoahunter.com/2015/01/23/docker-2/

作者:Michelangelo Chasseur 译者:DongShuaike 校对:wxy

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

本文向你介绍如何在 nginx 服务器上设置健壮的 SSL 安全机制。我们通过禁用 SSL 压缩来降低 CRIME 攻击威胁;禁用协议上存在安全缺陷的 SSLv3 及更低版本,并设置更健壮的 加密套件 cipher suite 来尽可能启用 前向安全性 Forward Secrecy ;此外,我们还启用了 HSTS 和 HPKP。这样我们就拥有了一个健壮而可经受考验的 SSL 配置,并可以在 Qually Labs 的 SSL 测试中得到 A 级评分。

如果不求甚解的话,可以从 https://cipherli.st 上找到 nginx 、Apache 和 Lighttpd 的安全设置,复制粘帖即可。

本教程在 Digital Ocean 的 VPS 上测试通过。如果你喜欢这篇教程,想要支持作者的站点的话,购买 Digital Ocean 的 VPS 时请使用如下链接:https://www.digitalocean.com/?refcode=7435ae6b8212

本教程可以通过发布于 2014/1/21 的 SSL 实验室测试的严格要求(我之前就通过了测试,如果你按照本文操作就可以得到一个 A+ 评分)。

你可以从下列链接中找到这方面的进一步内容:

我们需要编辑 nginx 的配置,在 Ubuntu/Debian 上是 /etc/nginx/sited-enabled/yoursite.com,在 RHEL/CentOS 上是 /etc/nginx/conf.d/nginx.conf

本文中,我们需要编辑443端口(SSL)的 server 配置中的部分。在文末你可以看到完整的配置例子。

在编辑之前切记备份一下配置文件!

野兽攻击(BEAST)和 RC4

简单的说, 野兽攻击 BEAST 就是通过篡改一个加密算法的 密码块链 CBC,cipher block chaining 的模式,从而可以对部分编码流量悄悄解码。更多信息参照上面的链接。

针对 野兽攻击 BEAST ,较新的浏览器已经启用了客户端缓解方案。推荐方案是禁用 TLS 1.0 的所有加密算法,仅允许 RC4 算法。然而,针对 RC4 算法的攻击也越来越多 ,很多已经从理论上逐步发展为实际可行的攻击方式。此外,有理由相信 NSA 已经实现了他们所谓的“大突破”——攻破 RC4 。

禁用 RC4 会有几个后果。其一,当用户使用老旧的浏览器时,比如 Windows XP 上的 IE 会用 3DES 来替代 RC4。3DES 要比 RC4 更安全,但是它的计算成本更高,你的服务器就需要为这些用户付出更多的处理成本。其二,RC4 算法能减轻 野兽攻击 BEAST 的危害,如果禁用 RC4 会导致 TLS 1.0 用户会换到更容易受攻击的 AES-CBC 算法上(通常服务器端的对 野兽攻击 BEAST 的“修复方法”是让 RC4 优先于其它算法)。我认为 RC4 的风险要高于 野兽攻击 BEAST 的风险。事实上,有了客户端缓解方案(Chrome 和 Firefox 提供了缓解方案), 野兽攻击 BEAST 就不是什么大问题了。而 RC4 的风险却在增长:随着时间推移,对加密算法的破解会越来越多。

怪物攻击(FREAK)

怪物攻击 FREAK 是一种中间人攻击,它是由来自 INRIA、微软研究院和 IMDEA 的密码学家们所发现的。 怪物攻击 FREAK 的缩写来自“ RSA 出口密钥因子分解 Factoring RSA-EXPORT Keys

这个漏洞可上溯到上世纪九十年代,当时美国政府禁止出口加密软件,除非其使用编码密钥长度不超过512位的出口加密套件。

这造成了一些现在的 TLS 客户端存在一个缺陷,这些客户端包括: 苹果的 SecureTransport 、OpenSSL。这个缺陷会导致它们会接受出口降级 RSA 密钥,即便客户端并没有要求使用出口降级 RSA 密钥。这个缺陷带来的影响很讨厌:在客户端存在缺陷,且服务器支持出口降级 RSA 密钥时,会发生中间人攻击,从而导致连接的强度降低。

攻击分为两个组成部分:首先是服务器必须接受“ 出口降级 RSA 密钥 export grade RSA ”。

中间人攻击可以按如下流程:

  • 在客户端的 Hello 消息中,要求标准的 RSA 加密套件。
  • 中间人攻击者修改该消息为 ‘输出级 RSA 密钥’ export RSA
  • 服务器回应一个512位的输出级 RSA 密钥,并以其长期密钥签名。
  • 由于 OpenSSL/SecureTransport 的缺陷,客户端会接受这个弱密钥。
  • 攻击者根据 RSA 模数分解因子来恢复相应的 RSA 解密密钥。
  • 当客户端编码 ‘预主密码’ pre-master secret 给服务器时,攻击者现在就可以解码它并恢复 TLS 的 ‘主密码’ master secret
  • 从这里开始,攻击者就能看到了传输的明文并注入任何东西了。

本文所提供的加密套件不启用输出降级加密,请确认你的 OpenSSL 是最新的,也强烈建议你将客户端也升级到新的版本。

心血漏洞(Heartbleed)

心血漏洞 Heartbleed 是一个于2014年4月公布的 OpenSSL 加密库的漏洞,它是一个被广泛使用的传输层安全(TLS)协议的实现。无论是服务器端还是客户端在 TLS 中使用了有缺陷的 OpenSSL,都可以被利用该缺陷。由于它是因 DTLS 心跳扩展(RFC 6520)中的输入验证不正确(缺少了边界检查)而导致的,所以该漏洞根据“心跳”而命名。这个漏洞是一种缓存区超读漏洞,它可以读取到本不应该读取的数据。

哪个版本的 OpenSSL 受到 心血漏洞 Heartbleed 的影响?

各版本情况如下:

  • OpenSSL 1.0.1 直到 1.0.1f (包括)存在该缺陷
  • OpenSSL 1.0.1g 没有该缺陷
  • OpenSSL 1.0.0 分支没有该缺陷
  • OpenSSL 0.9.8 分支没有该缺陷

这个缺陷是2011年12月引入到 OpenSSL 中的,并随着 2012年3月14日 OpenSSL 发布的 1.0.1 而泛滥。2014年4月7日发布的 OpenSSL 1.0.1g 修复了该漏洞。

升级你的 OpenSSL 就可以避免该缺陷。

SSL 压缩(罪恶攻击 CRIME)

罪恶攻击 CRIME 使用 SSL 压缩来完成它的魔法,SSL 压缩在下述版本是默认关闭的: nginx 1.1.6及更高/1.0.9及更高(如果使用了 OpenSSL 1.0.0及更高), nginx 1.3.2及更高/1.2.2及更高(如果使用较旧版本的 OpenSSL)。

如果你使用一个早期版本的 nginx 或 OpenSSL,而且你的发行版没有向后移植该选项,那么你需要重新编译没有一个 ZLIB 支持的 OpenSSL。这会禁止 OpenSSL 使用 DEFLATE 压缩方式。如果你禁用了这个,你仍然可以使用常规的 HTML DEFLATE 压缩。

SSLv2 和 SSLv3

SSLv2 是不安全的,所以我们需要禁用它。我们也禁用 SSLv3,因为 TLS 1.0 在遭受到降级攻击时,会允许攻击者强制连接使用 SSLv3,从而禁用了 前向安全性 forward secrecy

如下编辑配置文件:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

卷毛狗攻击(POODLE)和 TLS-FALLBACK-SCSV

SSLv3 会受到卷毛狗漏洞(POODLE)的攻击。这是禁用 SSLv3 的主要原因之一。

Google 提出了一个名为 TLS\_FALLBACK\_SCSV 的SSL/TLS 扩展,它用于防止强制 SSL 降级。如果你升级 到下述的 OpenSSL 版本会自动启用它。

  • OpenSSL 1.0.1 带有 TLS\_FALLBACK\_SCSV 1.0.1j 及更高。
  • OpenSSL 1.0.0 带有 TLS\_FALLBACK\_SCSV 1.0.0o 及更高。
  • OpenSSL 0.9.8 带有 TLS\_FALLBACK\_SCSV 0.9.8zc 及更高。

更多信息请参照 NGINX 文档

加密套件(cipher suite)

前向安全性 Forward Secrecy 用于在长期密钥被破解时确保会话密钥的完整性。 完备的前向安全性 PFS,Perfect Forward Secrecy 是指强制在每个/每次会话中推导新的密钥。

这就是说,泄露的私钥并不能用来解密(之前)记录下来的 SSL 通讯。

提供 完备的前向安全性 PFS,Perfect Forward Secrecy 功能的是那些使用了一种 Diffie-Hellman 密钥交换的短暂形式的加密套件。它们的缺点是系统开销较大,不过可以使用椭圆曲线的变体来改进。

以下两个加密套件是我推荐的,之后Mozilla 基金会也推荐了。

推荐的加密套件:

ssl_ciphers 'AES128+EECDH:AES128+EDH';

向后兼容的推荐的加密套件(IE6/WinXP):

ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";

如果你的 OpenSSL 版本比较旧,不可用的加密算法会自动丢弃。应该一直使用上述的完整套件,让 OpenSSL 选择一个它所支持的。

加密套件的顺序是非常重要的,因为其决定了优先选择哪个算法。上述优先推荐的算法中提供了PFS(完备的前向安全性)。

较旧版本的 OpenSSL 也许不能支持这个算法的完整列表,AES-GCM 和一些 ECDHE 算法是相当新的,在 Ubuntu 和 RHEL 中所带的绝大多数 OpenSSL 版本中不支持。

优先顺序的逻辑

  • ECDHE+AESGCM 加密是首选的。它们是 TLS 1.2 加密算法,现在还没有广泛支持。当前还没有对它们的已知攻击。
  • PFS 加密套件好一些,首选 ECDHE,然后是 DHE。
  • AES 128 要好于 AES 256。有一个关于 AES256 带来的安全提升程度是否值回成本的讨论,结果是显而易见的。目前,AES128 要更值一些,因为它提供了不错的安全水准,确实很快,而且看起来对时序攻击更有抵抗力。
  • 在向后兼容的加密套件里面,AES 要优于 3DES。在 TLS 1.1及其以上,减轻了针对 AES 的 野兽攻击 BEAST 的威胁,而在 TLS 1.0上则难以实现该攻击。在非向后兼容的加密套件里面,不支持 3DES。
  • RC4 整个不支持了。3DES 用于向后兼容。参看 #RC4\_weaknesses 中的讨论。

强制丢弃的算法

  • aNULL 包含了非验证的 Diffie-Hellman 密钥交换,这会受到 中间人 MITM 攻击
  • eNULL 包含了无加密的算法(明文)
  • EXPORT 是老旧的弱加密算法,是被美国法律标示为可出口的
  • RC4 包含的加密算法使用了已弃用的 ARCFOUR 算法
  • DES 包含的加密算法使用了弃用的数据加密标准(DES)
  • SSLv2 包含了定义在旧版本 SSL 标准中的所有算法,现已弃用
  • MD5 包含了使用已弃用的 MD5 作为哈希算法的所有算法

更多设置

确保你也添加了如下行:

ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;

在一个 SSLv3 或 TLSv1 握手过程中选择一个加密算法时,一般使用客户端的首选算法。如果设置了上述配置,则会替代地使用服务器端的首选算法。

前向安全性和 Diffie Hellman Ephemeral (DHE)参数

前向安全性 Forward Secrecy 的概念很简单:客户端和服务器协商一个永不重用的密钥,并在会话结束时销毁它。服务器上的 RSA 私钥用于客户端和服务器之间的 Diffie-Hellman 密钥交换签名。从 Diffie-Hellman 握手中获取的预主密钥会用于之后的编码。因为预主密钥是特定于客户端和服务器之间建立的某个连接,并且只用在一个限定的时间内,所以称作 短暂模式 Ephemeral

使用了前向安全性,如果一个攻击者取得了一个服务器的私钥,他是不能解码之前的通讯信息的。这个私钥仅用于 Diffie Hellman 握手签名,并不会泄露预主密钥。Diffie Hellman 算法会确保预主密钥绝不会离开客户端和服务器,而且不能被中间人攻击所拦截。

所有版本的 nginx(如1.4.4)都依赖于 OpenSSL 给 Diffie-Hellman (DH)的输入参数。不幸的是,这意味着 Diffie-Hellman Ephemeral(DHE)将使用 OpenSSL 的默认设置,包括一个用于密钥交换的1024位密钥。因为我们正在使用2048位证书,DHE 客户端就会使用一个要比非 DHE 客户端更弱的密钥交换。

我们需要生成一个更强壮的 DHE 参数:

cd /etc/ssl/certs
openssl dhparam -out dhparam.pem 4096

然后告诉 nginx 将其用作 DHE 密钥交换:

ssl_dhparam /etc/ssl/certs/dhparam.pem;

OCSP 装订(Stapling)

当连接到一个服务器时,客户端应该使用 证书吊销列表 CRL,Certificate Revocation List 在线证书状态协议 OCSP,Online Certificate Status Protocol 记录来校验服务器证书的有效性。CRL 的问题是它已经增长的太大了,永远也下载不完了。

OCSP 更轻量级一些,因为我们每次只请求一条记录。但是副作用是当连接到一个服务器时必须对第三方 OCSP 响应器发起 OCSP 请求,这就增加了延迟和带来了潜在隐患。事实上,CA 所运营的 OCSP 响应器非常不可靠,浏览器如果不能及时收到答复,就会静默失败。攻击者通过 DoS 攻击一个 OCSP 响应器可以禁用其校验功能,这样就降低了安全性。

解决方法是允许服务器在 TLS 握手中发送缓存的 OCSP 记录,以绕开 OCSP 响应器。这个机制节省了客户端和 OCSP 响应器之间的通讯,称作 OCSP 装订。

客户端会在它的 CLIENT HELLO 中告知其支持 status\_request TLS 扩展,服务器仅在客户端请求它的时候才发送缓存的 OCSP 响应。

大多数服务器最多会缓存 OCSP 响应48小时。服务器会按照常规的间隔连接到 CA 的 OCSP 响应器来获取刷新的 OCSP 记录。OCSP 响应器的位置可以从签名的证书中的 授权信息访问 Authority Information Access 字段中获得。

HTTP 严格传输安全(HSTS)

如有可能,你应该启用 HTTP 严格传输安全(HSTS),它会引导浏览器和你的站点之间的通讯仅通过 HTTPS。

HTTP 公钥固定扩展(HPKP)

你也应该启用 HTTP 公钥固定扩展(HPKP)

公钥固定的意思是一个证书链必须包括一个白名单中的公钥。它确保仅有白名单中的 CA 才能够为某个域名签署证书,而不是你的浏览器中存储的任何 CA。

我已经写了一篇关于 HPKP 的背景理论及在 Apache、Lighttpd 和 NGINX 中配置例子的文章

配置范例

server {

  listen [::]:443 default_server;

  ssl on;
  ssl_certificate_key /etc/ssl/cert/raymii_org.pem;
  ssl_certificate /etc/ssl/cert/ca-bundle.pem;

  ssl_ciphers 'AES128+EECDH:AES128+EDH:!aNULL';

  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_session_cache shared:SSL:10m;

  ssl_stapling on;
  ssl_stapling_verify on;
  resolver 8.8.4.4 8.8.8.8 valid=300s;
  resolver_timeout 10s;

  ssl_prefer_server_ciphers on;
  ssl_dhparam /etc/ssl/certs/dhparam.pem;

  add_header Strict-Transport-Security max-age=63072000;
  add_header X-Frame-Options DENY;
  add_header X-Content-Type-Options nosniff;

  root /var/www/;
  index index.html index.htm;
  server_name raymii.org;

}

结尾

如果你使用了上述配置,你需要重启 nginx:

# 首先检查配置文件是否正确
/etc/init.d/nginx configtest
# 然后重启
/etc/init.d/nginx restart

现在使用 SSL Labs 测试来看看你是否能得到一个漂亮的“A”。当然了,你也得到了一个安全的、强壮的、经得起考验的 SSL 配置!


via: https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html

作者:Remy van Elst 译者:wxy 校对:wxy

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

上一篇文章里,我们已经探讨了关于sort命令的多个例子,如果你错过了这篇文章,可以点击下面的链接进行阅读。今天的这篇文章作为上一篇文章的继续,将讨论关于sort命令的剩余用法,与上一篇一起作为Linux ‘sort’命令的完整指南。

在我们继续深入之前,先创建一个文本文档‘month.txt’,并且将上一次给出的数据填进去。

$ echo -e "mar\ndec\noct\nsep\nfeb\naug" > month.txt
$ cat month.txt

Populate Content

15、 通过使用’M‘选项,对’month.txt‘文件按照月份顺序进行排序。

$ sort -M month.txt

注意:‘sort’命令需要至少3个字符来确认月份名称。

Sort File Content by Month in Linux

16、 把数据整理成方便人们阅读的形式,比如1K、2M、3G、2T,这里面的K、G、M、T代表千、兆、吉、梯。 (LCTT 译注:此处命令有误,ls 命令应该增加 -h 参数,径改之)

$ ls -lh /home/$USER | sort -h -k5

Sort Content Human Readable Format

17、 在上一篇文章中,我们在例子4中创建了一个名为‘sorted.txt’的文件,在例子6中创建了一个‘lsl.txt’。‘sorted.txt'已经排好序了而’lsl.txt‘还没有。让我们使用sort命令来检查两个文件是否已经排好序。

$ sort -c sorted.txt

Check File is Sorted

如果它返回0,则表示文件已经排好序。

$ sort -c lsl.txt

Check File Sorted Status

报告无序。存在矛盾……

18、 如果文字之间的分隔符是空格,sort命令自动地将空格后的东西当做一个新文字单元,如果分隔符不是空格呢?

考虑这样一个文本文件,里面的内容可以由除了空格之外的任何符号分隔,比如‘|’,‘\’,‘+’,‘.’等……

创建一个分隔符为+的文本文件。使用‘cat‘命令查看文件内容。

$ echo -e "21+linux+server+production\n11+debian+RedHat+CentOS\n131+Apache+Mysql+PHP\n7+Shell Scripting+python+perl\n111+postfix+exim+sendmail" > delimiter.txt

$ cat delimiter.txt

Check File Content by Delimiter

现在基于由数字组成的第一个域来进行排序。

$ sort -t '+' -nk1 delimiter.txt

Sort File By Fields

然后再基于非数字的第四个域排序。

Sort Content By Non Numeric

如果分隔符是制表符,你需要在’+‘的位置上用$’\t’代替,如上例所示。

19、 对主用户目录下使用‘ls -l’命令得到的结果基于第五列(‘文件大小’)进行一个乱序排列。

$ ls -l /home/avi/ | sort -k5 -R 

Sort Content by Column in Random Order

每一次你运行上面的脚本,你得到结果可能都不一样,因为结果是随机生成的。

正如我在上一篇文章中提到的规则2所说——sort命令会将以小写字母开始的行排在大写字母开始的行前面。看一下上一篇文章的例3,字符串‘laptop’在‘LAPTOP’前出现。

20、 如何覆盖默认的排序优先权?在这之前我们需要先将环境变量LC\_ALL的值设置为C。在命令行提示栏中运行下面的代码。

$ export LC_ALL=C

然后以非默认优先权的方式对‘tecmint.txt’文件重新排序。

$ sort tecmint.txt

Override Sorting Preferences

覆盖排序优先权

不要忘记与example 3中得到的输出结果做比较,并且你可以使用‘-f’,又叫‘-ignore-case’(忽略大小写)的选项来获取更有序的输出。

$ sort -f tecmint.txt

Compare Sorting Preferences

21、 给两个输入文件进行‘sort‘,然后把它们连接成一行!

我们创建两个文本文档’file1.txt‘以及’file2.txt‘,并用数据填充,如下所示,并用’cat‘命令查看文件的内容。

$ echo -e “5 Reliable\n2 Fast\n3 Secure\n1 open-source\n4 customizable” > file1.txt
$ cat file1.txt

Populate Content with Numbers

用如下数据填充’file2.txt‘。

$ echo -e “3 RedHat\n1 Debian\n5 Ubuntu\n2 Kali\n4 Fedora” > file2.txt
$ cat file2.txt

Populate File with Data

现在我们对两个文件进行排序并连接。

$ join <(sort -n file1.txt) <(sort file2.txt)

Sort Join Two Files

我所要讲的全部内容就在这里了,希望与各位保持联系,也希望各位经常来逛逛。有反馈就在下面评论吧。


via: http://www.tecmint.com/linux-sort-command-examples/

作者:Avishek Kumar 译者:DongShuaike 校对:wxy

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