2020年8月

这个 Python 模块可以以多种格式收集网站使用日志并输出良好结构化数据以进行分析。

是否想知道有多少访问者访问过你的网站?或哪个页面、文章或下载最受欢迎?如果你是自托管的博客或网站,那么无论你使用的是 Apache、Nginx 还是 Microsoft IIS(是的,没错),lars都可以为你提供帮助。

Lars 是 Python 写的 Web 服务器日志工具包。这意味着你可以使用 Python 通过简单的代码来回溯(或实时)解析日志,并对数据做任何你想做的事:将它存储在数据库中、另存为 CSV 文件,或者立即使用 Python 进行更多分析。

Lars 是 Dave Jones 写的另一个隐藏的宝石。我最初是在本地 Python 用户组中看到 Dave 演示 lars。几年后,我们开始在 piwheels 项目中使用它来读取 Apache 日志并将行插入到我们的 Postgres 数据库中。当树莓派用户从 piwheels.org下载 Python 包时,我们会记录文件名、时间戳、系统架构(Arm 版本)、发行版名称/版本,Python 版本等。由于它是一个关系数据库,因此我们可以将这些结果加入其他表中以获得有关文件的更多上下文信息。

你可以使用以下方法安装lars:

$ pip install lars

在某些系统上,正确的方式是 sudo pip3 install lars

首先,找到一个 Web 访问日志并制作一个副本。你需要将日志文件下载到计算机上进行操作。我在示例中使用的是 Apache 日志,但是经过一些小(且直观)的更改,你可以使用 Nginx 或 IIS。在典型的 Web 服务器上,你会在 /var/log/apache2/ 中找到 Apache 日志,通常是 access.logssl_access.log(对于 HTTPS)或 gzip 压缩后的轮转日志文件,如 access-20200101.gz 或者 ssl_access-20200101.gz

首先,日志是什么样的?

81.174.152.222 - - [30/Jun/2020:23:38:03 +0000] "GET / HTTP/1.1" 200 6763 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:77.0) Gecko/20100101 Firefox/77.0"

这是一个显示了请求源 IP 地址、时间戳、请求文件路径(在本例中是主页 /)、HTTP 状态代码,用户代理(Ubuntu 上的 Firefox)等的请求。

你的日志文件将充满这样的条目,不仅是每个打开的页面,还包括返回的每个文件和资源:每个 CSS 样式表、JavaScript 文件和图像,每个 404 请求、每个重定向、每个爬虫。要从日志中获取有意义的数据,你需要对条目进行解析、过滤和排序。这就是 Lars 的用处。本示例将打开一个日志文件并打印每一行的内容:

with open('ssl_access.log') as f:
    with ApacheSource(f) as source:
        for row in source:
            print(row)

它会为每条日志显示如下结果:

Row(remote_host=IPv4Address('81.174.152.222'), ident=None, remote_user=None, time=DateTime(2020, 6, 30, 23, 38, 3), request=Request(method='GET', url=Url(scheme='', netloc='', path_str='/', params='', query_str='', fragment=''), protocol='HTTP/1.1'), status=200, size=6763)

它解析了日志条目,并将数据放入结构化格式中。该条目已成为具有与条目数据相关属性的 命名元组 namedtuple ,因此,例如,你可以使用 row.status 访问状态代码,并使用 row.request.url.path_str 访问路径:

with open('ssl_access.log') as f:
    with ApacheSource(f) as source:
        for row in source:
            print(f'hit {row.request.url.path_str} with status code {row.status}')

如果你只想显示 404 请求,可以执行以下操作:

with open('ssl_access.log') as f:
    with ApacheSource(f) as source:
        for row in source:
            if row.status == 404:
                print(row.request.url.path_str)

你可能要对这些数据去重,并打印独立的 404 页面数量:

s = set()
with open('ssl_access.log') as f:
    with ApacheSource(f) as source:
        for row in source:
            if row.status == 404:
                s.add(row.request.url.path_str)
print(len(s))

我和 Dave 一直在努力扩展 piwheel 的日志记录器,使其包含网页点击量、软件包搜索等内容,归功于 lars,这些并不难。它不会告诉我们有关用户的任何答案。我们仍然需要进行数据分析,但它去掉了复杂不便的文件格式,并以我们可以利用的方式将它放入我们的数据库。

查阅 lars 的文档,以了解如何读取 Apache、Nginx 和 IIS 日志,并了解你还可以使用它做什么。再次感谢 Dave 提供的出色工具!

最初发布在 Ben Nuttall 的 Tooling Blog 中,并获许重新发布。


via: https://opensource.com/article/20/7/python-lars

作者:Ben Nuttall 选题:lujun9972 译者:geekpi 校对:wxy

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

通过 OpenSSL 深入了解密码学的细节:哈希值、数字签名、数字证书等。

本系列的第一篇文章通过 OpenSSL 库和命令行实用程序介绍了哈希、加密/解密、数字签名和数字证书。这第二篇文章将对细节进行深入探讨。让我们从计算中无处不在的哈希开始,并考虑是什么使哈希函数具备密码学意义

密码学哈希

OpenSSL 源代码的下载页面包含了一个带有最新版本的表格。每个版本都有两个 哈希值 hash :160 位 SHA1 和 256 位 SHA256。这些值可以用来验证下载的文件是否与存储库中的原始文件相匹配:下载者在本地重新计算下载文件的哈希值,然后将结果与原始文件进行比较。现代系统有计算这种哈希值的实用程序。例如,Linux 有 md5sumsha256sum。OpenSSL 本身也提供了类似的命令行实用程序。

哈希值被用于计算的许多领域。例如,比特币区块链使用 SHA256 哈希值作为区块标识符。挖比特币就是生成一个低于指定阈值的 SHA256 哈希值,也就是至少有 N 个前导零的哈希值。(N 的值可以上升或下降,这取决于特定时间的挖矿生产力)。作为一个兴趣点,如今的矿机是为并行生成 SHA256 哈希值而设计的硬件集群。在 2018 年的一个高峰期,全球的比特币矿工每秒产生约 7500 万个 太哈希值 terahash —— 这真是一个不可思议的数字。

网络协议也使用哈希值(在这里通常叫做“ 校验和 checksum ”)来支持消息的完整性;也就是说,保证收到的消息与发送的消息是一样的。消息发送者计算消息的校验和,并将结果与消息一起发送。当消息到达时,接收方重新计算校验和。如果发送的校验和与重新计算的校验和不一致,那么消息在传输过程中可能出现了一些问题,或者发送的校验和出现了问题,或者两者都出现了问题。在这种情况下,应该重新发送消息和它的校验和,或者至少应该触发一个错误情况。(如 UDP 这样的低级网络协议不会理会校验和。)

哈希的其他例子大家都很熟悉。比如一个网站,要求用户用密码进行验证,用户在浏览器中输入密码,然后,他们通过 HTTPS 连接到服务器,密码从浏览器加密发送到服务器。一旦密码到达服务器,就会被解密,然后进行数据库表的查询。

在这个查询表中应该存储什么?存储密码本身是有风险的。风险要小得多的方式是存储一个由密码生成的哈希值,也许在计算哈希值之前“加一些 salt (额外的位)改善口味”。你的密码可能会被发送到 Web 服务器上,但网站可以向你保证,密码不会存储在那里。

哈希值还出现在安全的各个领域。例如, 基于哈希值的消息认证码 hash-based message authentication code HMAC)使用一个哈希值和一个秘密的 加密密钥 cryptographic key 来认证通过网络发送的消息。HMAC 码轻量级且易于在程序中使用,在 Web 服务中很受欢迎。一个 X509 数字证书包括一个称为 指纹 fingerprint 的哈希值,它可以方便证书验证。一个存放于内存中的 可信存储 truststore 可以实现为一个以这种指纹为键的查找表 —— 作为一个支持恒定查找时间的 哈希映射 hash map 。来自传入的证书的指纹可以与可信存储中的密钥进行比较,以确定是否匹配。

密码学哈希函数 cryptographic hash function 应该具有什么特殊属性?它应该是 单向 one-way 的,这意味着很难被逆转。一个加密哈希函数应该是比较容易计算的,但是计算它的反函数(将哈希值映射回输入位串的函数)在计算上应该是困难的。下面是一个描述,用 chf 作为加密哈希函数,我的密码 foobar 作为样本输入。

        +---+
foobar—>|chf|—>hash value ## 简单直接
        +--–+

相比之下,逆向操作是不可行的:

            +-----------+
hash value—>|chf inverse|—>foobar ## 棘手困难
            +-----------+

例如,回忆一下 SHA256 哈希函数。对于一个任意长度为 N > 0 的输入位串,这个函数会生成一个 256 位的固定长度的哈希值;因此,这个哈希值甚至不会反映出输入位串的长度 N,更不用说字符串中每个位的值了。顺便说一下,SHA256 不容易受到 长度扩展攻击 length extension attack 。唯一有效的逆向工程方法是通过蛮力搜索将计算出的 SHA256 哈希值逆向返回到输入位串,这意味着需要尝试所有可能的输入位串,直到找到与目标哈希值匹配的位串。这样的搜索在 SHA256 这样一个完善的加密哈希函数上是不可行的。

现在,最后一个回顾的知识点是 有序 in order 。加密哈希值是统计学上的唯一,而不是无条件的唯一,这意味着两个不同的输入位串产生相同的哈希值是不太可能的,但也不是不可能的 —— 这称之为 碰撞 collision 生日问题提供了一个很好的反直觉的碰撞例子。对各种哈希算法的 抗碰撞性 collision resistance 有着广泛的研究。例如,MD5(128 位哈希值)在大约 2 21 次哈希之后,抗碰撞能力就会崩溃。对于 SHA1(160 位哈希值),大约在 2 61 次哈希后开始崩溃。

对于 SHA256 的抗碰撞能力的剖析,目前还没有一个很好的估计。这个事实并不奇怪。SHA256 有 2 256 个不同的哈希值范围,这个数字的十进制表示法有 78 位之多!那么,SHA256 哈希会不会发生碰撞呢?当然可能,但可能性极小。

在下面的命令行示例中,有两个输入文件被用作位串源:hashIn1.txthashIn2.txt。第一个文件包含 abc,第二个文件包含 1a2b3c

为了便于阅读,这些文件包含的是文本,但也可以使用二进制文件代替。

在命令行(百分号 % 是提示符)使用 Linux sha256sum 实用程序对这两个文件进行处理产生以下哈希值(十六进制):

% sha256sum hashIn1.txt
9e83e05bbf9b5db17ac0deec3b7ce6cba983f6dc50531c7a919f28d5fb3696c3 hashIn1.txt

% sha256sum hashIn2.txt
3eaac518777682bf4e8840dd012c0b104c2e16009083877675f00e995906ed13 hashIn2.txt

OpenSSL 哈希对应的结果与预期相同:

% openssl dgst -sha256 hashIn1.txt
SHA256(hashIn1.txt)= 9e83e05bbf9b5db17ac0deec3b7ce6cba983f6dc50531c7a919f28d5fb3696c3

% openssl dgst -sha256 hashIn2.txt
SHA256(hashIn2.txt)= 3eaac518777682bf4e8840dd012c0b104c2e16009083877675f00e995906ed13

这种对密码学哈希函数的研究,为我们仔细研究数字签名及其与密钥对的关系奠定了基础。

数字签名

顾名思义, 数字签字 digital signature 可以附在文件或其他一些电子 工件 artifact (如程序)上,以证明其真实性。因此,这种签名类似于纸质文件上的手写签名。验证数字签名就是要确认两件事:第一,被担保的工件在签名被附上后没有改变,因为它部分是基于文件的加密学哈希值。第二,签名属于一个人(例如 Alice),只有她才能获得一对密钥中的私钥。顺便说一下,对代码(源码或编译后的代码)进行数字签名已经成为程序员的普遍做法。

让我们来了解一下数字签名是如何创建的。如前所述,没有公钥和私钥对就没有数字签名。当使用 OpenSSL 创建这些密钥时,有两个独立的命令:一个是创建私钥,另一个是从私钥中提取匹配的公钥。这些密钥对用 base64 编码,在这个过程中可以指定它们的大小。

私钥 private key 由数值组成,其中两个数值(一个 模数 modulus 和一个 指数 exponent )组成了公钥。虽然私钥文件包含了 公钥 public key ,但提取出来的公钥并不会透露相应私钥的值。

因此,生成的带有私钥的文件包含了完整的密钥对。将公钥提取到自己的文件中是很实用的,因为这两把钥匙有不同的用途,而这种提取方式也将私钥可能被意外公开的危险降到最低。

接下来,这对密钥的私钥被用来生成目标工件(如电子邮件)的哈希值,从而创建签名。在另一端,接收者的系统使用这对密钥的公钥来验证附在工件上的签名。

现在举个例子。首先,用 OpenSSL 生成一个 2048 位的 RSA 密钥对:

openssl genpkey -out privkey.pem -algorithm rsa 2048

在这个例子中,我们可以舍去 -algorithm rsa 标志,因为 genpkey 默认为 RSA 类型。文件的名称(privkey.pem)是任意的,但是 隐私增强邮件 Privacy Enhanced Mail (PEM)扩展名 .pem 是默认 PEM 格式的惯用扩展名。(如果需要的话,OpenSSL 有命令可以在各种格式之间进行转换。)如果需要更大的密钥大小(例如 4096),那么最后一个参数 2048 可以改成 4096。这些大小总是二的幂。

下面是产生的 privkey.pem 文件的一个片断,它是 base64 编码的:

-----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBANnlAh4jSKgcNj/Z
JF4J4WdhkljP2R+TXVGuKVRtPkGAiLWE4BDbgsyKVLfs2EdjKL1U+/qtfhYsqhkK
...
-----END PRIVATE KEY-----

接下来的命令就会从私钥中提取出这对密钥的公钥:

openssl rsa -in privkey.pem -outform PEM -pubout -out pubkey.pem

由此产生的 pubkey.pem 文件很小,可以在这里完整地显示出来:

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDZ5QIeI0ioHDY/2SReCeFnYZJY
z9kfk11RrilUbT5BgIi1hOAQ24LMilS37NhHYyi9VPv6rX4WLKoZCmkeYaWk/TR5
4nbH1E/AkniwRoXpeh5VncwWMuMsL5qPWGY8fuuTE27GhwqBiKQGBOmU+MYlZonO
O0xnAKpAvysMy7G7qQIDAQAB
-----END PUBLIC KEY-----

现在,有了密钥对,数字签名就很容易了 —— 在本例中,源文件 client.c 是要签名的工件:

openssl dgst -sha256 -sign privkey.pem -out sign.sha256 client.c

client.c 源文件的摘要是 SHA256,私钥在前面创建的 privkey.pem 文件中。由此产生的二进制签名文件是 sign.sha256,这是一个任意的名字。要得到这个文件的可读版本(比如 base64),后续命令是:

openssl enc -base64 -in sign.sha256 -out sign.sha256.base64

文件 sign.sha256.base64 现在包含如下内容:

h+e+3UPx++KKSlWKIk34fQ1g91XKHOGFRmjc0ZHPEyyjP6/lJ05SfjpAJxAPm075
VNfFwysvqRGmL0jkp/TTdwnDTwt756Ej4X3OwAVeYM7i5DCcjVsQf5+h7JycHKlM
o/Jd3kUIWUkZ8+Lk0ZwzNzhKJu6LM5KWtL+MhJ2DpVc=

或者,可执行文件 client 也可以被签名,由此产生的 base64 编码签名将如预期的不同:

VMVImPgVLKHxVBapJ8DgLNJUKb98GbXgehRPD8o0ImADhLqlEKVy0HKRm/51m9IX
xRAN7DoL4Q3uuVmWWi749Vampong/uT5qjgVNTnRt9jON112fzchgEoMb8CHNsCT
XIMdyaPtnJZdLALw6rwMM55MoLamSc6M/MV1OrJnk/g=

这一过程的最后一步是用公钥验证数字签名。作为验证的一个重要步骤,应重新计算用于签署工件(在本例中,是可执行的 client 程序)的哈希值,因为验证过程应表明工件在签署后是否发生了变化。

有两个 OpenSSL 命令用于这个目的。第一条命令是对 base64 签名进行解码。

openssl enc -base64 -d -in sign.sha256.base64 -out sign.sha256

第二条是核实签名:

openssl dgst -sha256 -verify pubkey.pem -signature sign.sha256 client

第二条命令的输出,应该是这样的:

Verified OK

为了了解验证失败时的情况,一个简短但有用的练习是将最后一个 OpenSSL 命令中的可执行的 client 文件替换为源文件 client.c,然后尝试验证。另一个练习是改变 client 程序,无论多么轻微,然后再试一次。

数字证书

数字证书 digital certificate 汇集了到目前为止所分析的各个部分:哈希值、密钥对、数字签名和加密/解密。生产级证书的第一步是创建一个 证书签名请求 certificate signing request (CSR),然后将其发送给 证书颁发机构 certificate authority (CA)。在 OpenSSL 的例子中,要做到这一点,请运行:

openssl req -out myserver.csr -new -newkey rsa:4096 -nodes -keyout myserverkey.pem

这个例子生成了一个 CSR 文档,并将该文档存储在文件 myserver.csr(base64 文本)中。这里的目的是:CSR 文档要求 CA 保证与指定域名相关联的身份,域名也就是 CA 所说的 通用名 common name (CN)。

尽管可以使用现有的密钥对,但这个命令也会生成一个新的密钥对。请注意,在诸如 myserver.csrmyserverkey.pem 等名称中使用 server 暗示了数字证书的典型用途:作为与 www.google.com 等域名相关的 Web 服务器的身份担保。

然而,无论数字证书如何使用,同样使用这个命令都会创建一个 CSR。它还会启动一个问题/回答的交互式会话,提示有关域名的相关信息,以便与请求者的数字证书相连接。这个交互式会话可以通过在命令中提供基本的信息,用反斜杠来续行一步完成。-subj 标志提供了所需的信息。

% openssl req -new \
-newkey rsa:2048 -nodes -keyout privkeyDC.pem \
-out myserver.csr \
-subj "/C=US/ST=Illinois/L=Chicago/O=Faulty Consulting/OU=IT/CN=myserver.com"

产生的 CSR 文件在发送给 CA 之前可以进行检查和验证。这个过程可以创建具有所需格式(如 X509)、签名、有效期等的数字证书。

openssl req -text -in myserver.csr -noout -verify

这是输出的一个片断:

verify OK
Certificate Request:
Data:
Version: 0 (0x0)
Subject: C=US, ST=Illinois, L=Chicago, O=Faulty Consulting, OU=IT, CN=myserver.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:ba:36:fb:57:17:65:bc:40:30:96:1b:6e:de:73:
…
Exponent: 65537 (0x10001)
Attributes:
a0:00
Signature Algorithm: sha256WithRSAEncryption
…

自签证书

在开发 HTTPS 网站的过程中,手头有一个不用经过 CA 流程的数字证书是很方便的。在 HTTPS 握手的认证阶段, 自签证书 self-signed certificate 就能满足要求,尽管任何现代浏览器都会警告说这样的证书毫无价值。继续这个例子,自签证书的 OpenSSL 命令(有效期为一年,使用 RSA 公钥)如下:

openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:4096 -keyout myserver.pem -out myserver.crt

下面的 OpenSSL 命令呈现了生成的证书的可读版本:

openssl x509 -in myserver.crt -text -noout

这是自签证书的部分输出:

Certificate:
Data:
Version: 3 (0x2)
Serial Number: 13951598013130016090 (0xc19e087965a9055a)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=US, ST=Illinois, L=Chicago, O=Faulty Consulting, OU=IT, CN=myserver.com
Validity
Not Before: Apr 11 17:22:18 2019 GMT
Not After : Apr 10 17:22:18 2020 GMT
Subject: C=US, ST=Illinois, L=Chicago, O=Faulty Consulting, OU=IT, CN=myserver.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (4096 bit)
Modulus:
00:ba:36:fb:57:17:65:bc:40:30:96:1b:6e:de:73:
...
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Key Identifier:
3A:32:EF:3D:EB:DF:65:E5:A8:96:D7:D7:16:2C:1B:29:AF:46:C4:91
X509v3 Authority Key Identifier:
keyid:3A:32:EF:3D:EB:DF:65:E5:A8:96:D7:D7:16:2C:1B:29:AF:46:C4:91

        X509v3 Basic Constraints:
            CA:TRUE
Signature Algorithm: sha256WithRSAEncryption
     3a:eb:8d:09:53:3b:5c:2e:48:ed:14:ce:f9:20:01:4e:90:c9:
     ...

如前所述,RSA 私钥包含的值是用来生成公钥的。但是,给定的公钥不会泄露匹配的私钥。关于底层数学理论的介绍,见 https://simple.wikipedia.org/wiki/RSA_algorithm

数字证书与用于生成该证书的密钥对之间存在着重要的对应关系,即使证书只是自签的:

  • 数字证书包含构成公钥的指数和模数值。这些值是最初生成的 PEM 文件中密钥对的一部分,在本例中,是文件 myserver.pem
  • 指数 exponent 几乎总是 65,537(如本例中),所以可以忽略。
  • 密钥对的 模数 modulus 应该与数字证书的模数相匹配。

模数是一个很大的值,为了便于阅读,可以进行哈希处理。下面是两个 OpenSSL 命令,它们检查相同的模数,从而确认数字证书是基于 PEM 文件中的密钥对。

% openssl x509 -noout -modulus -in myserver.crt | openssl sha1 ## 证书中的模数
(stdin)= 364d21d5e53a59d482395b1885aa2c3a5d2e3769

% openssl rsa -noout -modulus -in myserver.pem | openssl sha1 ## 密钥中的模数
(stdin)= 364d21d5e53a59d482395b1885aa2c3a5d2e3769

所产生的哈希值匹配,从而确认数字证书是基于指定的密钥对。

回到密钥分发问题上

让我们回到第一部分末尾提出的一个问题:client 程序和 Google Web 服务器之间的 TLS 握手。握手协议有很多种,即使是用在 client 例子中的 Diffie-Hellman 版本也有不同的方式。尽管如此,client 例子遵循了一个共同的模式。

首先,在 TLS 握手过程中,client 程序和 Web 服务器就 加密套件 cipher suite 达成一致,其中包括要使用的算法。在本例中,该套件是 ECDHE-RSA-AES128-GCM-SHA256

现在值得关注的两个要素是 RSA 密钥对算法和 AES128 块密码,用于在握手成功的情况下对消息进行加密和解密。关于加密/解密,这个过程有两种流派: 对称 symmetric 非对称 asymmetric 。在对称流派中,加密和解密使用的是相同的密钥,这首先就引出了 密钥分发问题 key distribution problem 。如何将密钥安全地分发给双方?在非对称流派中,一个密钥用于加密(在这种情况下,是 RSA 公钥),但另一个密钥用于解密(在这种情况下,是来自同一对密钥的 RSA 私钥)。

client 程序拥有来认证证书的 Google Web 服务器的公钥,而 Web 服务器拥有来自同一对密钥的私钥。因此,client 程序可以向 Web 服务器发送加密信息,而 Web 服务器可以单独对该通信进行解密。

在 TLS 的情况下,对称方式有两个显著的优势:

  • client 程序与 Google Web 服务器之间的互动中,认证是单向的。Google Web 服务器向 client 程序发送三张证书,但 client 程序并没有向 Web 服务器发送证书,因此,Web 服务器没有来自客户端的公钥,无法加密发给客户端的消息。
  • 使用 AES128 的对称加密/解密比使用 RSA 密钥的非对称加密/解密快了近千倍

TLS 握手将两种加密/解密方式巧妙地结合在一起。在握手过程中,client 程序会生成随机位,即所谓的 预主密 pre-master secret (PMS)。然后,client 程序用服务器的公钥对 PMS 进行加密,并将加密后的 PMS 发送给服务器,服务器再用 RSA 密钥对的私钥对 PMS 信息进行解密:

              +-------------------+ encrypted PMS  +--------------------+
client PMS--->|server’s public key|--------------->|server’s private key|--->server PMS
              +-------------------+                +--------------------+

在这个过程结束时,client 程序和 Google Web 服务器现在拥有相同的 PMS 位。每一方都使用这些位生成一个 主密码 master secret ,并立即生成一个称为 会话密钥 session key 的对称加密/解密密钥。现在有两个不同但等价的会话密钥,连接的每一方都有一个。在 client 的例子中,会话密钥是 AES128 类的。一旦在 client 程序和 Google Web 服务器两边生成了会话密钥,每一边的会话密钥就会对双方的对话进行保密。如果任何一方(例如,client 程序)或另一方(在这种情况下,Google Web 服务器)要求重新开始握手,握手协议(如 Diffie-Hellman)允许整个 PMS 过程重复进行。

总结

在命令行上说明的 OpenSSL 操作也可以通过底层库的 API 完成。这两篇文章重点使用了这个实用程序,以保持例子的简短,并专注于加密主题。如果你对安全问题感兴趣,OpenSSL 是一个很好的开始地方,并值得深入研究。


via: https://opensource.com/article/19/6/cryptography-basics-openssl-part-2

作者:Marty Kalin 选题:lujun9972 译者:wxy 校对:wxy

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

波音 747 飞机通过 3.5 英寸软盘接收关键软件更新

据外媒报道,波音 747-400 系列飞机仍然使用软盘来加载关键的导航数据库,Pen Test Partners(PTP)在打探了最近被退役的一架飞机的情况后,向信息安全社区透露了这一消息。PTP 的 Lomas 在对飞机进行参观时,指出了导航数据库加载器。Lomas 说:“这个数据库必须每28天更新一次,所以你可以看到这对工程师来说有多么繁琐的访问。”Lomas 指着软盘驱动器说--在正常操作中,软盘驱动器被藏在一个上锁的面板后面。

来源:cnBeta.COM

拍一拍:令人吃惊,居然能在先进的飞机上见到如此落后的数据交换方式,虽然说在飞行器上采用保守的技术更新有利于飞行安全,但是这也太保守了。

COVID-19 大流行影响营收后,Mozilla 将裁员 250 人

本次裁减约四分之一的员工。此次裁员将意味着 Mozilla 将减少产品功能性开发和改进开发者工具等方面的支出。Firefox 浏览器的使用量正在稳步下降,从 2017 年的每月约 3 亿用户下降到今天的 2.1 亿。Mozilla 1 月份的一次裁员已经削减了大约 70 个工作岗位,这使该组织的员工人数减少到 1000 人左右。

来源:cnBeta.COM

拍一拍:Mozilla 的日子越来越不好过了,可叹。而另外一方面,微软却开源做的风生水起。

求售失败,Have I Been Pwned 准备开源

Have I Been Pwned(HIBP)是一个全网密码泄露检查网站,提供“一键查询”帐号密码是否遭泄露的服务,只要在 HIBP 输入邮件地址,HIBP 便能扫描出这个帐号及对应的密码是否在互联网上被泄露过。随着 HIBP 越来越受欢迎,创始人 Troy Hunt 无法以一己之力进行维护,于是在去年公开求售,现在 Hunt 宣布由于求售失败,因此决定开源 HIBP,将其贡献给社区,让大家共同改进 HIBP。到目前为止,HIBP 已存储了 80 亿条数据外泄纪录,并有 300 万人订阅了通知功能。

来源:开源中国

拍一拍:开源可能拯救不了 HIBP。

dig 是一个强大而灵活的工具,用于查询域名系统(DNS)服务器。在这篇文章中,我们将深入了解它的工作原理以及它能告诉你什么。

dig 是一款强大而灵活的查询 DNS 名称服务器的工具。它执行 DNS 查询,并显示参与该过程的名称服务器返回的应答以及与搜索相关的细节。系统管理员和 DNS 管理员经常使用 dig 来帮助排除 DNS 问题。在这篇文章中,我们将深入了解它的工作原理,看看它能告诉我们什么。

开始之前,对 DNS(域名系统)的工作方式有一个基本的印象是很有帮助的。它是全球互联网的关键部分,因为它提供了一种查找世界各地的服务器的方式,从而可以与之连接。你可以把它看作是互联网的地址簿,任何正确连接到互联网的系统,都应该能够使用它来查询任何正确注册的服务器的 IP 地址。

dig 入门

Linux 系统上一般都默认安装了 dig 工具。下面是一个带有一点注释的 dig 命令的例子:

$ dig www.networkworld.com

; <<>> DiG 9.16.1-Ubuntu <<>> www.networkworld.com <== 你使用的 dig 版本
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 6034
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:                            <== 你的查询细节
;www.networkworld.com.          IN      A

;; ANSWER SECTION:                              <== 结果

www.networkworld.com.   3568    IN      CNAME   idg.map.fastly.net.
idg.map.fastly.net.     30      IN      A       151.101.250.165

;; Query time: 36 msec                          <== 查询用时
;; SERVER: 127.0.0.53#53(127.0.0.53)            <== 本地缓存解析器
;; WHEN: Fri Jul 24 19:11:42 EDT 2020           <== 查询的时间
;; MSG SIZE  rcvd: 97                           <== 返回的字节数

如果你得到了一个这样的应答,是好消息吗?简短的回答是“是”。你得到了及时的回复。状态字段(status: NOERROR)显示没有问题。你正在连接到一个能够提供所要求的信息的名称服务器,并得到一个回复,告诉你一些关于你所查询的系统的重要细节。简而言之,你已经验证了你的系统和域名系统相处得很好。

其他可能的状态指标包括:

  • SERVFAIL:被查询的名称存在,但没有数据或现有数据无效。
  • NXDOMAIN:所查询的名称不存在。
  • REFUSED:该区域的数据不存在于所请求的权威服务器中,并且在这种情况下,基础设施没有设置为提供响应服务。

下面是一个例子,如果你要查找一个不存在的域名,你会看到什么?

$ dig cannotbe.org

; <<>> DiG 9.16.1-Ubuntu <<>> cannotbe.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 35348
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

一般来说,digping 会提供更多的细节,如果域名不存在,ping 会回复 “名称或服务未知”。当你查询一个合法的系统时,你可以看到域名系统对该系统知道些什么,这些记录是如何配置的,以及检索这些数据需要多长时间。

(LCTT 译注:dig 也比 nslookup 提供的数据更多。此外,dig 采用的是操作系统的解析库,而 nslookup 采用的是自己提供的解析库,这有时候会带来不同的行为。最后,有趣的一点是,dig 的返回的格式是符合 BIND 区域文件格式的。)

事实上,有时 dig 可以在 ping 完全不能响应的时候进行响应,当你试图确定一个连接问题时,这种信息是非常有用的。

DNS 记录类型和标志

在上面的第一个查询中,我们可以看到一个问题,那就是同时存在 CNAMEA 记录。CNAME 规范名称 canonical name )就像一个别名,把一个域名指向另一个域名。你查询的大多数系统不会有 CNAME 记录,而只有 A 记录。如果你运行 dig localhost 命令,你会看到一个 A 记录,它就指向 127.0.0.1 —— 这是每个系统都使用的“回环”地址。A 记录用于将一个名字映射到一个 IP 地址。

DNS 记录类型包括:

  • AAAAA:IPv4 或 IPv6 地址
  • CNAME:别名
  • MX:邮件交换器
  • NS:名称服务器
  • PTR:一个反向条目,让你根据 IP 地址找到系统名称
  • SOA:表示授权记录开始
  • TXT 一些相关文本

我们还可以在上述输出的第五行看到一系列的“标志”。这些定义在 RFC 1035 中 —— 它定义了 DNS 报文头中包含的标志,甚至显示了报文头的格式。

                                1  1  1  1  1  1
  0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                      ID                       |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|QR|   Opcode  |AA|TC|RD|RA|   Z    |   RCODE   |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                    QDCOUNT                    |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                    ANCOUNT                    |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                    NSCOUNT                    |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                    ARCOUNT                    |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

在上面的初始查询中,第五行显示的标志是:

  • qr = 查询
  • rd = 进行递归查询
  • ra = 递归数据可用

RFC 中描述的其他标志包括:

  • aa = 权威答复
  • cd = 检查是否禁用
  • ad = 真实数据
  • opcode = 一个 4 位字段
  • tc = 截断
  • z(未使用)

添加 +trace 选项

如果你添加 +trace 选项,你将从 dig 得到更多的输出。它会添加更多信息,显示你的 DNS 查询如何通过名称服务器的层次结构找到你要找的答案。

下面显示的所有 NS 记录都反映了名称服务器 —— 这只是你将看到的数据的第一部分,因为查询通过名称服务器的层次结构来追踪你要找的东西:

$ dig +trace networkworld.com

; <<>> DiG 9.16.1-Ubuntu <<>> +trace networkworld.com
;; global options: +cmd
.                       84895   IN      NS      k.root-servers.net.
.                       84895   IN      NS      e.root-servers.net.
.                       84895   IN      NS      m.root-servers.net.
.                       84895   IN      NS      h.root-servers.net.
.                       84895   IN      NS      c.root-servers.net.
.                       84895   IN      NS      f.root-servers.net.
.                       84895   IN      NS      a.root-servers.net.
.                       84895   IN      NS      g.root-servers.net.
.                       84895   IN      NS      l.root-servers.net.
.                       84895   IN      NS      d.root-servers.net.
.                       84895   IN      NS      b.root-servers.net.
.                       84895   IN      NS      i.root-servers.net.
.                       84895   IN      NS      j.root-servers.net.
;; Received 262 bytes from 127.0.0.53#53(127.0.0.53) in 28 ms
...

最终,你会得到与你的要求直接挂钩的信息:

networkworld.com.       300     IN      A       151.101.2.165
networkworld.com.       300     IN      A       151.101.66.165
networkworld.com.       300     IN      A       151.101.130.165
networkworld.com.       300     IN      A       151.101.194.165
networkworld.com.       14400   IN      NS      ns-d.pnap.net.
networkworld.com.       14400   IN      NS      ns-a.pnap.net.
networkworld.com.       14400   IN      NS      ns0.pcworld.com.
networkworld.com.       14400   IN      NS      ns1.pcworld.com.
networkworld.com.       14400   IN      NS      ns-b.pnap.net.
networkworld.com.       14400   IN      NS      ns-c.pnap.net.
;; Received 269 bytes from 70.42.185.30#53(ns0.pcworld.com) in 116 ms

挑选响应者

你可以使用 @ 符号来指定一个特定的名称服务器来处理你的查询。在这里,我们要求 Google 的主名称服务器响应我们的查询:

$ dig @8.8.8.8 networkworld.com

; <<>> DiG 9.16.1-Ubuntu <<>> @8.8.8.8 networkworld.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43640
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;networkworld.com.              IN      A

;; ANSWER SECTION:
networkworld.com.       299     IN      A       151.101.66.165
networkworld.com.       299     IN      A       151.101.194.165
networkworld.com.       299     IN      A       151.101.130.165
networkworld.com.       299     IN      A       151.101.2.165

;; Query time: 48 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Sat Jul 25 11:21:19 EDT 2020
;; MSG SIZE  rcvd: 109

下面所示的命令对 8.8.8.8 IP 地址进行反向查找,以显示它属于 Google 的 DNS 服务器。

$ nslookup 8.8.8.8
8.8.8.8.in-addr.arpa    name = dns.google.

总结

dig 命令是掌握 DNS 工作原理和在出现连接问题时排除故障的重要工具。


via: https://www.networkworld.com/article/3568488/digging-for-dns-answers-on-linux.html

作者:Sandra Henry-Stocker 选题:lujun9972 译者:wxy 校对:wxy

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

代码英雄讲述了开发人员、程序员、黑客、极客和开源反叛者如何彻底改变技术前景的真实史诗。

什么是《代码英雄》

代码英雄 Command Line Heroes 是世界领先的企业开源软件解决方案供应商红帽(Red Hat)精心制作的原创音频播客,讲述开发人员、程序员、黑客、极客和开源反叛者如何彻底改变技术前景的真实史诗。该音频博客邀请到了谷歌、NASA 等重量级企业的众多技术大牛共同讲述开源、操作系统、容器、DevOps、混合云等发展过程中的动人故事。

本文是《代码英雄》系列播客第一季(2):操作系统战争(下)音频脚本。

Saron Yitbarek: 这玩意开着的吗?让我们播放一段跟星球大战电影一样的开场字幕吧,第二集开始了!

00:00:30 - 配音: OS 战争第二部分:Linux 的崛起。微软帝国控制着 90% 的用桌面用户,操作系统的完全标准化似乎是板上钉钉的事了。所以公司们把它们的注意力从桌面端的个人用户,转移到了专业人士上,它们为了服务器的所有权打得不可开交。但是一个有点让人意想不到的英雄出现在开源“反叛组织”中。戴着眼镜,固执的 林纳斯·托瓦兹 Linus Torvalds 免费发布了他的 Linux® 程序。微软摔了个趔趄,并且开始重新调整战略。

00:01:00 - Saron Yitbarek: 哦,我们极客们就是喜欢那样。上一次我们讲到哪了?苹果和微软互相攻伐,试图在争夺桌面用户的战争中占据主导地位。在第一集的结尾,我们看到微软获得了大部分的市场份额。很快,互联网的兴起以及随之而来的开发者大军,让整个市场都经历了一场地震。互联网将战场从在家庭和办公室中的个人电脑用户转移到拥有数百台服务器的大型商业客户中。

00:01:30 - Saron Yitbarek: 这意味着巨量资源的迁移。突然间,所有相关企业不仅被迫为服务器空间和网站建设付费,还必须集成软件来进行资源跟踪和数据库监控等工作。至少那时候大家都是这么做的,你需要很多开发人员来帮助你。

在操作系统之战的第二部分,我们将看到固有优势的巨大转变,以及像林纳斯·托瓦兹和 理查德·斯托尔曼 Richard Stallman 这样的开源反叛者,是如何成功地在微软和整个软件行业的核心引发恐惧的。

00:02:00 - Saron Yitbarek: 我是 Saron Yitbarek,你现在收听的是代码英雄,一款红帽公司原创的播客节目。每一集,我们都会给你带来“从码开始”,用技术改变科技的人,他们的故事。

00:02:30 - Saron Yitbarek: 好。想象一下你是 1991 年时的微软。你自我感觉良好,对吧?你满怀信心,确立了全球主导地位的感觉真不错。你已经掌握了与其他企业合作的艺术,但是仍然将大部分开发人员、程序员和系统管理员排除在联盟之外,而他们才是真正的武装力量。这时出现了一个叫林纳斯·托瓦兹的芬兰极客。他和一帮信奉开源的程序员开始发布 Linux,这个操作系统内核是由他们一起编写出来的。

00:03:00 - Saron Yitbarek: 坦白地说,如果你是微软公司,你并不会太在意 Linux,甚至不太关心开源运动,但是最终,Linux 的规模变得如此之大,以至于微软不可能不注意到。Linux 第一个版本出现在 1991 年,当时大概有 1 万行代码。十年后,则是 300 万行代码。如果你想了解知道现在的 Linux 怎么样了 —— 它有 2000 万行代码。

00:03:30 - Saron Yitbarek: 让我们在 90 年代初停留一会儿,那时 Linux 还没有成为我们现在所知道的庞然大物。这只是一个正在蔓延的,拥有病毒一般感染力的奇怪操作系统,不过全世界的极客和黑客都爱上了它。那时候我还太年轻,但有点希望我曾经历过那个年代。在那个时候,发现 Linux 就如同进入了一个秘密社会,程序员与朋友们分享刻录的 Linux CD 集,就像其他人分享地下音乐混音带一样。

00:03:40: 开发者 Tristram Oaten 讲讲你 16 岁时第一次接触 Linux 的故事吧。

00:04:00 - Tristram Oaten: 我和我的家人去了红海的 Hurghada 潜水度假,那是一个美丽的地方,强烈推荐。也许我妈妈跟我说过不要这么做,但第一天,我还是喝了自来水。所以我整个星期都病得很厉害,没法离开旅馆房间。当时我只带了一台新安装了 Slackware Linux 的笔记本电脑,我只是听说过这玩意,现在却要尝试使用它。我手上没有其他的应用程序,我能接触的所有东西只有刻录在 8 张 CD 上的代码。这种情况下,我整个星期能做的事情,就是了解这个外星造物一般的系统。我阅读手册,摆弄着终端。我记得当时我甚至不知道一个点(表示当前目录)和两个点(表示前一个目录)之间的区别。

00:04:30 - Tristram Oaten: 我一点头绪都没有。犯过很多错误。但慢慢的,在这种被迫造成的孤独中,我突破了障碍,开始明白并理解命令行到底是怎么回事。假期结束时,我没有看过金字塔、尼罗河等任何埃及遗址,但我解锁了现代世界的一个奇迹。我接触了 Linux,接下来的事大家都知道了。

Saron Yitbarek: 你会从很多人那里听到关于这个故事的不同版本,访问 Linux 命令行是一种革命性的体验。

00:05:00 - David Cantrell: 它提供了源代码。我当时的感觉是,“太神奇了。”

Saron Yitbarek: 我们正在参加一个名为 Flock to Fedora 的 2017 年 Linux 开发者大会。

David Cantrell: ……非常有吸引力。我觉得随着我掌控这个系统越深,它就越吸引我。我想,从 1995 年我第一次编译 Linux 内核那时起,我就迷上了它。

Saron Yitbarek: 这是开发者 David Cantrell 与 Joe Brockmire。

00:05:30 - Joe Brockmeier: 我在 Cheap Software 转的时候发现了一套四张 CD 的 Slackware Linux。它看起来会非常令人兴奋而且很有趣,所以我把它带回家,安装在我的第二台电脑上,开始摆弄它,有两件事情让我感到很兴奋:一个是我运行的不是 Windows,另一个是 Linux 的开源特性。

00:06:00 - Saron Yitbarek: 某种程度上来说,使用命令行的人总是存在的。在开源真正开始流行起来的二十年前,人们(至少在开发人员是这样)总是希望能够做到完全控制机器。让我们回到操作系统大战之前的那个时代,在苹果和微软为他们的 GUI 而战之前,那时也有代码英雄。 保罗·琼斯 Paul Jones 教授(在线图书馆 ibiblio.org 的负责人)就是一名那个古老年代的开发人员。

00:06:30 - Paul Jones: 从本质上讲,互联网在那个时候客户端-服务器架构还是比较少的,而更多的是点对点架构的。确实,我们会说,某种 VAX 到 VAX 的连接(LCTT 译注:DEC 的一种操作系统),某种科学工作站到科学工作站的连接。这并不意味着没有客户端-服务端的架构及应用程序,但这的确意味着,最初的设计是思考如何实现点对点,它与 IBM 一直在做的东西相对立。IBM 给你的只有哑终端,这种终端只能让你管理用户界面,却无法让你像真正的终端一样为所欲为。

00:07:00 - Saron Yitbarek: 当图形用户界面在普通用户中普及的同时,在工程师和开发人员中总是存在着一股相反的力量。早在 Linux 出现之前的二十世纪七八十年代,这股力量就存在于 Emacs 和 GNU 中。斯托曼的自由软件基金会中的某些人想要使用完全命令行,但直到上世纪 90 年代的 Linux 出现,才提供了前所未有的东西。

00:07:30 - Saron Yitbarek: Linux 和其他开源软件的早期爱好者是都是先驱。我正站在他们的肩膀上,我们都是。

你现在收听的是代码英雄,一款由红帽公司原创的播客。这是操作系统大战的第二部分:Linux 崛起。

Steven Vaughan-Nichols: 1998 年的时候,情况发生了变化。

00:08:00 - Saron Yitbarek: Steven Vaughan-Nichols 是 zdnet.com 的特约编辑,他已经写了几十年从商业方面论述技术的文章了。他将向我们讲述 Linux 是如何慢慢变得越来越流行,直到自愿贡献者的数量远远超过了工作于 Windows 上的微软开发人员的数量。不过,Linux 桌面版本从未真正追上 Windows,这也许就是微软最开始时忽略了 Linux 及其开发者的原因。Linux 真正大放光彩的地方是服务器机房,当企业开始线上业务时,每个企业都需要一个满足其独特需求的解决方案。

00:08:30 - Saron Yitbarek: WindowsNT 于 1993 年问世,当时它已经在与其他的服务器操作系统展开竞争了,但是许多开发人员都在想,“既然我可以通过 Apache 构建出基于 Linux 的廉价系统,那我为什么要购买 AIX 设备或大型 Windows 设备呢?”鉴于这个优点,Linux 代码已经开始渗透到几乎所有的在线机器中。

00:09:00 - Steven Vaughan-Nichols: 让微软开始意识到并感到惊讶的是,Linux 实际上已经有了一些商业应用,不是在桌面环境,而是在商业服务器上。因此,他们发起了一场运动,我们称之为 FUD - 恐惧、不确定和怀疑 fear, uncertainty and double 。他们说,“哦,Linux 这玩意,真的没有那么好。它不太可靠,你根本不能相信它”。

00:09:30 - Saron Yitbarek: 这种软宣传式的攻击持续了一段时间。微软也不是唯一一个对 Linux 感到紧张的公司,整个行业其实都在对抗这个奇怪新人的挑战。例如,任何与 UNIX 有利害关系的人都可能将 Linux 视为篡夺者。有一个案例很著名,那就是 SCO 组织(它发行过一种 UNIX 版本)在过去 10 多年里发起一系列的诉讼,试图阻止 Linux 的传播,而 SCO 最终失败而且破产了。与此同时,微软一直在寻找机会,他们必须要采取动作,只是不清楚具体该怎么做。

00:10:00 - Steven Vaughan-Nichols: 第二年,真正让微软担心的事情发生了。在 2000 年的时候,IBM 宣布,他们将于 2001 年投资 10 亿美元在 Linux 上。现在,IBM 已经不再涉足个人电脑业务。那时他们还没有走出那一步,但他们正朝着这个方向前进,他们将 Linux 视为服务器和大型计算机的未来,在这一点上 —— 剧透警告,IBM 是正确的。

00:10:30 - Steven Vaughan-Nichols: Linux 将主宰服务器世界。

Saron Yitbarek: 这已经不再仅仅是一群黑客所钟爱的,对命令行绝地武士式的控制了。金钱的投入对 Linux 助力极大。 Linux 国际 Linux International 的执行董事 John “Mad Dog” Hall 有一个可以解释为什么事情会变成这样的故事分享,我们通过电话与他取得了联系。

00:11:00 - John Hall: 我有一个名叫 Dirk Holden 的朋友,他是德国德意志银行的系统管理员,他也参与了个人电脑上早期 X Windows 系统图形项目的工作。有一天我去银行拜访他,我说:“Dirk,你银行里有 3000 台服务器,用的都是 Linux。为什么不用 Microsoft NT 呢?”

00:11:30 - John Hall: 他看着我说:“是的,我有 3000 台服务器,如果使用微软的 Windows NT 系统,我需要 2999 名系统管理员。”他继续说道:“而使用 Linux,我只需要四个。”这真是完美的答案。

00:12:00 - Saron Yitbarek: 程序员们着迷的这些东西恰好对大公司也极具吸引力。但由于 FUD 的作用,一些企业对此持谨慎态度。他们听到开源,就想:“开源。这看起来不太可靠,很混乱,充满了 BUG”。但正如那位银行经理所指出的,金钱有一种有趣的魔力,可以说服人们不再踌躇。甚至那些只需要网站的小公司也加入了 Linux 阵营。与一些昂贵的专有选择相比,使用一个廉价的 Linux 系统在成本上是无法比拟的。如果你是一家雇佣专业人员来构建网站的商店,那么你肯定想让他们使用 Linux。

00:12:30 - Saron Yitbarek: 让我们快进几年。Linux 充当着几乎所有网站的服务器,Linux 已经征服了服务器世界,然后智能手机也随之诞生。当然,苹果和他们的 iPhone 占据了相当大的市场份额,而且微软也希望能进入这个市场。但令人惊讶的是,Linux 已经等在那里并做好准备,迫不及待要大展拳脚。

这是作家兼记者 James Allworth。

00:13:00 - James Allworth: 肯定还有容纳第二个竞争者的空间,那本可以是微软,但是实际上却是 Android,而 Andrid 是基于 Linux 的。众所周知,Android 被谷歌所收购,现在运行在世界上大部分的智能手机上,谷歌在 Linux 的基础上创建了 Android。Linux 使他们能够以零成本,基于一个非常复杂的操作系统构建一个新的东西。他们盘算着推广这个系统,并最终成功地实现了这一目标。至少从操作系统的角度来看是这样,他们将微软挡在了下一代手机竞争之外。

00:13:30 - Saron Yitbarek: 这可是个大地震,很大程度上,微软有被埋没的风险。John Gossman 是微软 Azure 团队的首席架构师。他还记得当时公司的迷茫。

00:14:00 - John Gossman: 像许多公司一样,微软也非常担心知识产权污染。他们认为,如果允许开发人员使用开源代码,即使只是将一些代码复制粘贴到某些产品中,也会让某种病毒式的许可证生效从而引发未知的风险……他们也很困惑,我认为,这跟公司文化有关,很多公司,包括微软,都对开源开发的意义和商业模式之间的分歧感到困惑。有一种观点认为,开源意味着你所有的软件都是免费的,人们永远不会付钱。

00:14:30 - Saron Yitbarek: 任何习惯于投资于旧的、专有软件模式的人都会觉得这里发生的一切对他们构成了威胁。当你威胁到像微软这样的大公司时,是的,他们一定会做出反应。他们推动所有这些 FUD —— 恐惧、不确定性和怀疑是有道理的。当时,商业运作的方式基本上就是相互竞争。不过,如果是其他公司的话,他们可能还会一直怀恨在心,抱残守缺,但到了 2013 年的微软,一切都变了。

00:15:00 - Saron Yitbarek: 微软的云计算服务 Azure 上线了,令人震惊的是,它从第一天开始就提供了 Linux 虚拟机。 史蒂夫·鲍尔默 Steve Ballmer ,这位把 Linux 称为癌症的首席执行官,已经离开了,代替他的是一位新的有远见的首席执行官 萨提亚·纳德拉 Satya Nadella

John Gossman: 萨提亚有不同的看法,他属于另一个世代。比保罗、比尔和史蒂夫更年轻的世代,他对开源有不同的看法。

Saron Yitbarek: 这是John Gossman,他还是来自微软 Azure 团队。

00:15:30 - John Gossman: 大约四年前,出于实际需要,我们在 Azure 中添加了 Linux 支持。如果访问任何一家企业客户,你都会发现他们并不是现在才决定是使用 Windows 还是使用 Linux、使用 .net 还是使用 Java。他们在很久以前就做出了决定 —— 大约 15 年前,虽然对此有一些争论。

00:16:00 - John Gossman: 现在,我见过的每一家公司都混合了 Linux 和 Java、Windows 和 .net、SQL Server、Oracle 和 MySQL —— 基于专有源代码的产品和开放源代码的产品。

如果你打算运维一个云服务,允许这些公司在云上运行他们的业务,那么你根本不能告诉他们,“你可以使用这个软件,不能使用那个软件。”

00:16:30 - Saron Yitbarek: 这正是萨提亚·纳德拉采纳的哲学思想。2014 年秋季,他站在舞台上,希望传递一个重要信息。“微软爱 Linux”。他接着说,“20% 的 Azure 业务已经是 Linux 了,微软将始终对 Linux 发行版提供一流的支持。”没有哪怕一丝对开源的宿怨。

为了说明这一点,在他们的背后有一个巨大的标志,上面写着:“Microsoft ❤️ Linux”。哇噢。对我们中的一些人来说,这种转变有点令人震惊,但实际上,无需如此震惊。下面是 Steven Levy,一名科技记者兼作家。

00:17:00 - Steven Levy: 当你在踢足球的时候,如果草坪变滑了,那么你也许会换一种不同的鞋子。微软当初就是这么做的。

00:17:30 - Steven Levy: 他们不能否认现实,而且他们也是聪明人。所以他们必须意识到,这就是这个世界的运行方式。即使他们有一点尴尬,但是不管他们早些时候说了什么现在都要抛开。不然让他们之前那些“开源多么可怕”的言论影响到现在的决策,才真的是不明智之举。

00:18:00 - Saron Yitbarek: 微软低下了它高傲的头。你可能还记得苹果公司,经过多年的孤立无援,最终转向与微软构建合作伙伴关系。现在轮到微软进行 180 度转变了。经过多年的与开源方式的战斗后,他们正在重塑自己。要么改变,要么死亡。下一个发言的是 Steven Vaughan-Nichols。

00:18:30 - Steven Vaughan-Nichols: 即使是像微软这样规模的公司,也无法与数千个开发着包括 Linux 在内的其它开源大项目的开发者竞争。很长时间以来他们都不愿意合作,前微软首席执行官史蒂夫·鲍尔默对 Linux 用接近信仰的方式深恶痛绝。由于它使用的 GPL 许可证,他视 Linux 为一种癌症。不过一旦鲍尔默被扫地出门,新的微软领导层表示,“这就好像试图命令潮流不要过来,但潮水依然会不断涌进来。我们应该与 Linux 合作,而不是与之对抗。”

00:19:30 - Steven Vaughan-Nichols: 2017 年的微软既不是史蒂夫·鲍尔默的微软,也不是比尔·盖茨的微软。这是一家完全不同的公司,有着完全不同的理念,而且,一旦使用了开源,你就无法退回到之前的阶段。开源已经吞噬了整个技术世界。从未听说过 Linux 的人可能对它并不了解,但是每次他们访问 Facebook,他们都在运行 Linux。每次执行谷歌搜索时,你都在运行 Linux。

00:20:00 - Steven Vaughan-Nichols: 每次你用 Android 手机,你都在运行 Linux。它确实无处不在,微软无法阻止它,而且我认为,以为微软想用某种方式接管它的想法太天真了。

00:20:30 - Saron Yitbarek: 开源支持者可能一直担心微软会像混入羊群中的狼一样,但事实是,开源软件的本质保护了它,让它无法被完全控制。没有一家公司能够拥有 Linux 并以某种特定的方式控制它。Greg Kroah-Hartman 是 Linux 基金会的一名成员。

Greg Kroah-Hartman: 每个公司和个人都因为自己的利益对 Linux 做出贡献。他们之所以这样做是因为他们想要解决他们所面临的问题,可能是硬件无法工作,或者是他们想要添加一个新功能来做其他事情,又或者想引导 Linux 的开发轨道,这样他们的新产品就能使用它。这很棒,因为他们会把代码贡献回去,此后每个人都会从中受益,这样每个人都可以用到这份代码。正是因为这种自私,所有的公司,所有的人都能从中受益。

00:21:00 - Saron Yitbarek: 微软已经意识到,在即将到来的云战争中,与 Linux 作战就像与空气作战一样。Linux 和开源不是敌人,它们是空气。如今,微软以白金会员的身份加入了 Linux 基金会。他们成为 GitHub 开源项目的头号贡献者。

00:21:30 - Saron Yitbarek: 2017 年 9 月,他们甚至加入了 开源促进联盟 Open Source Initiative (OSI)。现在,微软在开源许可证下发布了很多代码。微软的 John Gossman 描述了他们开源 .net 时所发生的事情。起初,他们并不认为自己能得到什么回报。

00:22:00 - John Gossman: 我们本没有指望来自社区的贡献,然而,三年后,超过 50% 的对 .net 框架库的贡献来自于微软之外,这些是大量的代码。三星为 .net 提供了 ARM 支持。Intel 和 ARM 以及其他一些芯片厂商已经为 .net 框架贡献了特定于他们处理器的代码,以及数量惊人的修复 bug、性能改进等等 —— 既有单个贡献者也有社区。

Saron Yitbarek: 直到几年前,今天的这个微软,这个开放的微软,还是不可想象的。

00:22:30 - Saron Yitbarek: 我是 Saron Yitbarek,这里是代码英雄。好吧,我们已经看到了为了赢得数百万桌面用户的爱而战的激烈场面。我们已经看到开源软件在专有软件巨头的背后悄然崛起,并攫取了巨大的市场份额。

00:23:00 - Saron Yitbarek: 我们已经看到了一批批的代码英雄将编程领域变成了我你今天看到的这个样子。如今,大企业正在吸收开源软件,通过这一切,每个人都从他人那里受益。

00:23:30 - Saron Yitbarek: 在技术的西部荒野,一贯如此。苹果受到施乐的启发,微软受到苹果的启发,Linux 受到 UNIX 的启发。进化、借鉴、不断成长。如果比喻成大卫和歌利亚(LCTT 译注:西方经典的以弱胜强战争中的两个主角)的话,开源软件不再是大卫,但是,你知道吗?它也不是歌利亚。开源已经超越了这些角色,它成为了其他人战斗的战场。随着开源变得不可避免,新的战争,那些在云计算中进行的战争,那些在开源战场上进行的战争正在加剧。

这是 Steven Levy,他是一名作者。

00:24:00 - Steven Levy: 基本上,到目前为止,包括微软在内,有四到五家公司,正以各种方式努力把自己打造成为全方位的平台,比如人工智能领域。你能看到智能助手之间的战争,你猜怎么着?苹果有一个智能助手,叫 Siri。微软有一个,叫 Cortana。谷歌有谷歌助手,三星也有一个智能助手,亚马逊也有一个,叫 Alexa。我们看到这些战斗遍布各地。也许,你可以说,最热门的人工智能平台将控制我们生活中所有的东西,而这五家公司就是在为此而争斗。

00:24:30 - Saron Yitbarek: 如果你正在寻找另一个反叛者,它们就像 Linux 奇袭微软那样,偷偷躲在 Facebook、谷歌或亚马逊身后,你也许要等很久,因为正如作家 James Allworth 所指出的,成为一个真正的反叛者只会变得越来越难。

00:25:00 - James Allworth: 规模一直以来都是一种优势,但规模优势本质上……怎么说呢,我认为以前它们在本质上是线性的,现在它们在本质上是指数型的了,所以,一旦你开始以某种方法走在前面,另一个新玩家要想赶上来就变得越来越难了。我认为在互联网时代这大体来说来说是正确的,无论是因为规模,还是数据赋予组织的竞争力的重要性和优势。

00:25:30 - James Allworth: 一旦你走在前面,你就会吸引更多的客户,这就给了你更多的数据,让你能做得更好,这之后,客户还有什么理由选择排名第二的公司呢,难道是因为因为他们落后了这么远么?我认为在云的时代这个逻辑也不会有什么不同。

00:26:00 - Saron Yitbarek: 这个故事始于史蒂夫·乔布斯和比尔·盖茨这样的非凡的英雄,但科技的进步已经呈现出一种众包、自有生命的感觉。我认为据说我们的开源英雄林纳斯·托瓦兹在第一次发明 Linux 内核时甚至没有一个真正的计划。他无疑是一位才华横溢的年轻开发者,但他也像潮汐前的一滴水一样。变革是不可避免的。据估计,对于一家专有软件公司来说,用他们老式的、专有的方式创建一个 Linux 发行版将花费他们超过 100 亿美元。这说明了开源的力量。

00:26:30 - Saron Yitbarek: 最后,这并不是一个专有模型所能与之竞争的东西。成功的公司必须保持开放。这是最大、最终极的教训。还有一点要记住:当我们团结在一起的时候,我们在已有基础上成长和建设的能力是无限的。不管这些公司有多大,我们都不必坐等他们给我们更好的东西。想想那些为了纯粹的创造乐趣而学习编码的新开发者,那些自己动手丰衣足食的人。

未来的优秀程序员无管来自何方,只要能够访问代码,他们就能构建下一个大项目。

00:27:00 - Saron Yitbarek: 以上就是我们关于操作系统战争的故事。这场战争塑造了我们的数字生活的形态,争夺主导地位的斗争从桌面转移到了服务器机房,最终进入了云计算领域。过去的敌人难以置信地变成了盟友,众包的未来让一切都变得开放。

00:27:30 - Saron Yitbarek: 听着,我知道,在这段历史之旅中,还有很多英雄我们没有提到。所以给我们写信吧,分享你的故事。Redhat.com/commandlineheroes 。我恭候佳音。

在本季剩下的时间里,我们将学习今天的英雄们在创造什么,以及他们要经历什么样的战斗才能将他们的创造物带入我们的生活。让我们从壮丽的编程一线,回来看看更多的传奇故事吧。我们每两周放一集新的博客。几周后,我们将为你带来第三集:敏捷革命。

00:28:00 - Saron Yitbarek: 代码英雄是一款红帽公司原创的播客。要想免费自动获得新一集的代码英雄,请订阅我们的节目。只要在苹果播客、Spotify、Google Play,或其他应用中搜索“Command Line Heroes”。然后点击“订阅”。这样你就会第一个知道什么时候有新剧集了。

我是 Saron Yitbarek。感谢收听,在下期节目之前,请坚持编程。

什么是 LCTT SIG 和 LCTT LCRH SIG

LCTT SIG 是 LCTT 特别兴趣小组 Special Interest Group ,LCTT SIG 是针对特定领域、特定内容的翻译小组,翻译组成员将遵循 LCTT 流程和规范,参与翻译,并获得相应的奖励。LCRH SIG 是 LCTT 联合红帽(Red Hat)发起的 SIG,当前专注任务是《代码英雄》系列播客的脚本汉化,已有数十位贡献者加入。敬请每周三、周五期待经过我们精心翻译、校对和发布的译文。欢迎加入 LCRH SIG :</article-12436-1.html>

关于重制版

本系列第一季的前三篇我们已经发布过,这次根据新的 SIG 规范重新修订发布。


via: https://www.redhat.com/en/command-line-heroes/season-1/os-wars-part-2-rise-of-linux

作者:redhat 选题:lujun9972 译者:lujun9972 校对:acyanbird

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

中国论文数跃居世界第一

在自然科学领域的论文篇数上,中国已超过美国跃居第 1 位。中国在研发费方面也猛追美国。在研究者人数方面,中国最多,通过赴美国留学等方式推进培育。科学论文篇数是衡量一个国家的研发活跃程度的最基本指标。由于各年波动明显,以 3 年平均进行计算。中国 2017 年(2016~2018年平均)的论文篇数为 30 万 5927 篇。超过美国的 28 万 1487 篇,跃居第 1 位。第 3 位是德国,为 6 万 7041 篇。日本为 6 万 4874 篇,排在第 4 位。从论文的全球份额看,中国为 19.9%,美国为 18.3%,德国仅为 4.4%。

来源:solidot

拍一拍:变化总在潜移默化之中,虽然有些论文质量堪忧,但是这个不独是中国的现象。

Fedora IoT 有望升级为官方版本

Fedora Linux 发行版提供了适用于特定应用场景的诸多版本,例如面向普通笔记本和台式机的桌面版本 Fedora Workstation、面向云及服务器的 Fedora Server、关注容器的 Fedora CoreOS 和适用于 IoT 场景的 Fedora IoT 等。Fedora Workstation 和 Fedora Server 是目前仅有的两个官方版本。成为官方版本有助于 Fedora IoT 的普及并被更多地采用,提升 Fedora 在物联网生态中的影响力。

来源:开源中国

拍一拍:从 RedHat 和 Canonical 来看,除了桌面,在 IoT 和云方面的发力是 Linux 发行版的发展之路。