2016年7月

在这篇文章中,我们会点评一些可以在 Linux 上安装使用的最好的 Markdown 编辑器。 你可以在 Linux 平台上找到非常多的 的 Markdown 编辑器,但是在这里我们将尽可能地为您推荐那些最好的。

Best Linux Markdown Editors

对于不了解 Markdown 的人做个简单介绍,Markdown 是由著名的 Aaron Swartz 和 John Gruber 发明的标记语言,其最初的解析器是一个用 Perl 写的简单、轻量的同名工具。它可以将用户写的纯文本转为可用的 HTML(或 XHTML)。它实际上是一门易读,易写的纯文本语言,以及一个用于将文本转为 HTML 的转换工具。

希望你先对 Markdown 有一个稍微的了解,接下来让我们逐一列出这些编辑器。

1. Atom

Atom 是一个现代的、跨平台、开源且强大的文本编辑器,它可以运行在 Linux、Windows 和 MAC OS X 等操作系统上。用户可以在它的基础上进行定制,删减修改任何配置文件。

它包含了一些非常杰出的特性:

  • 内置软件包管理器
  • 智能自动补全功能
  • 提供多窗口操作
  • 支持查找替换功能
  • 包含一个文件系统浏览器
  • 轻松自定义主题
  • 开源、高度扩展性的软件包等

Atom Markdown Editor for Linux

访问主页: https://atom.io/

2. GNU Emacs

Emacs 是 Linux 平台上一款的流行文本编辑器。它是一个非常棒的、具备高扩展性和定制性的 Markdown 语言编辑器。

它综合了以下这些神奇的特性:

  • 带有丰富的内置文档,包括适合初学者的教程
  • 有完整的 Unicode 支持,可显示所有的人类符号
  • 支持内容识别的文本编辑模式
  • 包括多种文件类型的语法高亮
  • 可用 Emacs Lisp 或 GUI 对其进行高度定制
  • 提供了一个包系统可用来下载安装各种扩展等

Emacs Markdown Editor for Linux

访问主页: https://www.gnu.org/software/emacs/

3. Remarkable

Remarkable 可能是 Linux 上最好的 Markdown 编辑器了,它也适用于 Windows 操作系统。它的确是是一个卓越且功能齐全的 Markdown 编辑器,为用户提供了一些令人激动的特性。

一些卓越的特性:

  • 支持实时预览
  • 支持导出 PDF 和 HTML
  • 支持 Github Markdown 语法
  • 支持定制 CSS
  • 支持语法高亮
  • 提供键盘快捷键
  • 高可定制性和其他

Remarkable Markdown Editor for Linux

访问主页: https://remarkableapp.github.io

4. Haroopad

Haroopad 是为 Linux,Windows 和 Mac OS X 构建的跨平台 Markdown 文档处理程序。用户可以用它来书写许多专家级格式的文档,包括电子邮件、报告、博客、演示文稿和博客文章等等。

功能齐全且具备以下的亮点:

  • 轻松导入内容
  • 支持导出多种格式
  • 广泛支持博客和邮件
  • 支持许多数学表达式
  • 支持 Github Markdown 扩展
  • 为用户提供了一些令人兴奋的主题、皮肤和 UI 组件等等

Haroopad Markdown Editor for Linux

访问主页: http://pad.haroopress.com/

5. ReText

ReText 是为 Linux 和其它几个 POSIX 兼容操作系统提供的简单、轻量、强大的 Markdown 编辑器。它还可以作为一个 reStructuredText 编辑器,并且具有以下的特性:

  • 简单直观的 GUI
  • 具备高定制性,用户可以自定义语法文件和配置选项
  • 支持多种配色方案
  • 支持使用多种数学公式
  • 启用导出扩展等等

ReText Markdown Editor for Linux

访问主页: https://github.com/retext-project/retext

6. UberWriter

UberWriter 是一个简单、易用的 Linux Markdown 编辑器。它的开发受 Mac OS X 上的 iA writer 影响很大,同样它也具备这些卓越的特性:

  • 使用 pandoc 进行所有的文本到 HTML 的转换
  • 提供了一个简洁的 UI 界面
  • 提供了一种 专心 distraction free 模式,高亮用户最后的句子
  • 支持拼写检查
  • 支持全屏模式
  • 支持用 pandoc 导出 PDF、HTML 和 RTF
  • 启用语法高亮和数学函数等等

UberWriter Markdown Editor for Linux

访问主页: http://uberwriter.wolfvollprecht.de/

7. Mark My Words

Mark My Words 同样也是一个轻量、强大的 Markdown 编辑器。它是一个相对比较新的编辑器,因此提供了包含语法高亮在内的大量的功能,简单和直观的 UI。

下面是一些棒极了,但还未捆绑到应用中的功能:

  • 实时预览
  • Markdown 解析和文件 IO
  • 状态管理
  • 支持导出 PDF 和 HTML
  • 监测文件的修改
  • 支持首选项设置

MarkMyWords Markdown Editor for-Linux

访问主页: https://github.com/voldyman/MarkMyWords

8. Vim-Instant-Markdown 插件

Vim 是 Linux 上的一个久经考验的强大、流行而开源的文本编辑器。它用于编程极棒。它也高度支持插件功能,可以让用户为其增加一些其它功能,包括 Markdown 预览。

有好几种 Vim 的 Markdown 预览插件,但是 Vim-Instant-Markdown 的表现最佳。

9. Bracket-MarkdownPreview 插件

Brackets 是一个现代、轻量、开源且跨平台的文本编辑器。它特别为 Web 设计和开发而构建。它的一些重要功能包括:支持内联编辑器、实时预览、预处理支持及更多。

它也是通过插件高度可扩展的,你可以使用 Bracket-MarkdownPreview 插件来编写和预览 Markdown 文档。

Brackets Markdown Plugin Preview

10. SublimeText-Markdown 插件

Sublime Text 是一个精心打造的、流行的、跨平台文本编辑器,用于代码、markdown 和普通文本。它的表现极佳,包括如下令人兴奋的功能:

  • 简洁而美观的 GUI
  • 支持多重选择
  • 提供专心模式
  • 支持窗体分割编辑
  • 通过 Python 插件 API 支持高度插件化
  • 完全可定制化,提供命令查找模式

SublimeText-Markdown 插件是一个支持格式高亮的软件包,带有一些漂亮的颜色方案。

SublimeText Markdown Plugin Preview

结论

通过上面的列表,你大概已经知道要为你的 Linux 桌面下载、安装什么样的 Markdown 编辑器和文档处理程序了。

请注意,这里提到的最好的 Markdown 编辑器可能对你来说并不是最好的选择。因此你可以通过下面的反馈部分,为我们展示你认为列表中未提及的,并且具备足够的资格的,令人兴奋的 Markdown 编辑器。


via: http://www.tecmint.com/best-markdown-editors-for-linux/

作者:Aaron Kili 译者:Locez 校对:wxy

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

欢迎来到“Fedora 中的容器技术”系列!本文是该系列文章中的第一篇,它将说明你可以怎样使用 Fedora 中各种可用的容器技术。本文将学习 systemd-nspawn 的相关知识。

容器是什么?

一个容器就是一个用户空间实例,它能够在与托管容器的系统(叫做宿主系统)相隔离的环境中运行一个程序或者一个操作系统。这和 chroot虚拟机 的思想非常类似。运行在容器中的进程是由与宿主操作系统相同的内核来管理的,但它们是与宿主文件系统以及其它进程隔离开的。

什么是 systemd-nspawn?

systemd 项目认为应当将容器技术变成桌面的基础部分,并且应当和用户的其余系统集成在一起。为此,systemd 提供了 systemd-nspawn,这款工具能够使用多种 Linux 技术创建容器。它也提供了一些容器管理工具。

systemd-nspawnchroot 在许多方面都是类似的,但是前者更加强大。它虚拟化了文件系统、进程树以及客户系统中的进程间通信。它的吸引力在于它提供了很多用于管理容器的工具,例如用来管理容器的 machinectl。由 systemd-nspawn 运行的容器将会与 systemd 组件一同运行在宿主系统上。举例来说,一个容器的日志可以输出到宿主系统的日志中。

在 Fedora 24 上,systemd-nspawn 已经从 systemd 软件包分离出来了,所以你需要安装 systemd-container 软件包。一如往常,你可以使用 dnf install systemd-container 进行安装。

创建容器

使用 systemd-nspawn 创建一个容器是很容易的。假设你有一个专门为 Debian 创造的应用,并且无法在其它发行版中正常运行。那并不是一个问题,我们可以创造一个容器!为了设置容器使用最新版本的 Debian(现在是 Jessie),你需要挑选一个目录来放置你的系统。我暂时将使用目录 ~/DebianJessie

一旦你创建完目录,你需要运行 debootstrap,你可以从 Fedora 仓库中安装它。对于 Debian Jessie,你运行下面的命令来初始化一个 Debian 文件系统。

$ debootstrap --arch=amd64 stable ~/DebianJessie

以上默认你的架构是 x86\_64。如果不是的话,你必须将架构的名称改为 amd64。你可以使用 uname -m 得知你的机器架构。

一旦设置好你的根目录,你就可以使用下面的命令来启动你的容器。

$ systemd-nspawn -bD ~/DebianJessie

容器将会在数秒后准备好并运行,当你试图登录时就会注意到:你无法使用你的系统上任何账户。这是因为 systemd-nspawn 虚拟化了用户。修复的方法很简单:将之前的命令中的 -b 移除即可。你将直接进入容器的 root 用户的 shell。此时,你只能使用 passwd 命令为 root 设置密码,或者使用 adduser 命令添加一个新用户。一旦设置好密码或添加好用户,你就可以把 -b 标志添加回去然后继续了。你会进入到熟悉的登录控制台,然后你使用设置好的认证信息登录进去。

以上对于任意你想在容器中运行的发行版都适用,但前提是你需要使用正确的包管理器创建系统。对于 Fedora,你应使用 DNF 而非 debootstrap。想要设置一个最小化的 Fedora 系统,你可以运行下面的命令,要将“/absolute/path/”替换成任何你希望容器存放的位置。

$ sudo dnf --releasever=24 --installroot=/absolute/path/ install systemd passwd dnf fedora-release

设置网络

如果你尝试启动一个服务,但它绑定了你宿主机正在使用的端口,你将会注意到这个问题:你的容器正在使用和宿主机相同的网络接口。幸运的是,systemd-nspawn 提供了几种可以将网络从宿主机分开的方法。

本地网络

第一种方法是使用 --private-network 标志,它默认仅创建一个回环设备。这对于你不需要使用网络的环境是非常理想的,例如构建系统和其它持续集成系统。

多个网络接口

如果你有多个网络接口设备,你可以使用 --network-interface 标志给容器分配一个接口。想要给我的容器分配 eno1,我会添加选项 --network-interface=eno1。当某个接口分配给一个容器后,宿主机就不能同时使用那个接口了。只有当容器彻底关闭后,宿主机才可以使用那个接口。

共享网络接口

对于我们中那些并没有额外的网络设备的人来说,还有其它方法可以访问容器。一种就是使用 --port 选项。这会将容器中的一个端口定向到宿主机。使用格式是 协议:宿主机端口:容器端口,这里的协议可以是 tcp 或者 udp宿主机端口 是宿主机的一个合法端口,容器端口 则是容器中的一个合法端口。你可以省略协议,只指定 宿主机端口:容器端口。我通常的用法类似 --port=2222:22

你可以使用 --network-veth 启用完全的、仅宿主机模式的网络,这会在宿主机和容器之间创建一个虚拟的网络接口。你也可以使用 --network-bridge 桥接二者的连接。

使用 systemd 组件

如果你容器中的系统含有 D-Bus,你可以使用 systemd 提供的实用工具来控制并监视你的容器。基础安装的 Debian 并不包含 dbus。如果你想在 Debian Jessie 中使用 dbus,你需要运行命令 apt install dbus

machinectl

为了能够轻松地管理容器,systemd 提供了 machinectl 实用工具。使用 machinectl,你可以使用 machinectl login name 登录到一个容器中、使用 machinectl status name检查状态、使用 machinectl reboot name 启动容器或者使用 machinectl poweroff name 关闭容器。

其它 systemd 命令

多数 systemd 命令,例如 journalctl, systemd-analyzesystemctl,都支持使用 --machine 选项来指定容器。例如,如果你想查看一个名为 “foobar” 的容器的日志,你可以使用 journalctl --machine=foobar。你也可以使用 systemctl --machine=foobar status service 来查看运行在这个容器中的服务状态。

和 SELinux 一起工作

如果你要使用 SELinux 强制模式(Fedora 默认模式),你需要为你的容器设置 SELinux 环境。想要那样的话,你需要在宿主系统上运行下面两行命令。

$ semanage fcontext -a -t svirt_sandbox_file_t "/path/to/container(/.*)?"
$ restorecon -R /path/to/container/

确保使用你的容器路径替换 “/path/to/container”。对于我的容器 "DebianJessie",我会运行下面的命令:

$ semanage fcontext -a -t svirt_sandbox_file_t "/home/johnmh/DebianJessie(/.*)?"
$ restorecon -R /home/johnmh/DebianJessie/

via: https://fedoramagazine.org/container-technologies-fedora-systemd-nspawn/

作者:John M. Harris, Jr. 译者:ChrisLeeGit 校对:wxy

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

我很想知道一个 shell (像 bash,csh 等)内部是如何工作的。于是为了满足自己的好奇心,我使用 Python 实现了一个名为 yosh (Your Own Shell)的 Shell。本文章所介绍的概念也可以应用于其他编程语言。

(提示:你可以在这里查找本博文使用的源代码,代码以 MIT 许可证发布。在 Mac OS X 10.11.5 上,我使用 Python 2.7.10 和 3.4.3 进行了测试。它应该可以运行在其他类 Unix 环境,比如 Linux 和 Windows 上的 Cygwin。)

让我们开始吧。

步骤 0:项目结构

对于此项目,我使用了以下的项目结构。

yosh_project
|-- yosh
   |-- __init__.py
   |-- shell.py

yosh_project 为项目根目录(你也可以把它简单命名为 yosh)。

yosh 为包目录,且 __init__.py 可以使它成为与包的目录名字相同的包(如果你不用 Python 编写的话,可以忽略它。)

shell.py 是我们主要的脚本文件。

步骤 1:Shell 循环

当启动一个 shell,它会显示一个命令提示符并等待你的命令输入。在接收了输入的命令并执行它之后(稍后文章会进行详细解释),你的 shell 会重新回到这里,并循环等待下一条指令。

shell.py 中,我们会以一个简单的 main 函数开始,该函数调用了 shell\_loop() 函数,如下:

def shell_loop():
    # Start the loop here

def main():
    shell_loop()

if __name__ == "__main__":
    main()

接着,在 shell_loop() 中,为了指示循环是否继续或停止,我们使用了一个状态标志。在循环的开始,我们的 shell 将显示一个命令提示符,并等待读取命令输入。

import sys

SHELL_STATUS_RUN = 1
SHELL_STATUS_STOP = 0

def shell_loop():
    status = SHELL_STATUS_RUN

    while status == SHELL_STATUS_RUN:
        ### 显示命令提示符
        sys.stdout.write('> ')
        sys.stdout.flush()

        ### 读取命令输入
        cmd = sys.stdin.readline()

之后,我们 切分命令 tokenize 输入并进行 执行 execute (我们即将实现 tokenizeexecute 函数)。

因此,我们的 shell\_loop() 会是如下这样:

import sys

SHELL_STATUS_RUN = 1
SHELL_STATUS_STOP = 0

def shell_loop():
    status = SHELL_STATUS_RUN

    while status == SHELL_STATUS_RUN:
        ### 显示命令提示符
        sys.stdout.write('> ')
        sys.stdout.flush()

        ### 读取命令输入
        cmd = sys.stdin.readline()

        ### 切分命令输入
        cmd_tokens = tokenize(cmd)

        ### 执行该命令并获取新的状态
        status = execute(cmd_tokens)

这就是我们整个 shell 循环。如果我们使用 python shell.py 启动我们的 shell,它会显示命令提示符。然而如果我们输入命令并按回车,它会抛出错误,因为我们还没定义 tokenize 函数。

为了退出 shell,可以尝试输入 ctrl-c。稍后我将解释如何以优雅的形式退出 shell。

步骤 2: 命令切分 tokenize

当用户在我们的 shell 中输入命令并按下回车键,该命令将会是一个包含命令名称及其参数的长字符串。因此,我们必须切分该字符串(分割一个字符串为多个元组)。

咋一看似乎很简单。我们或许可以使用 cmd.split(),以空格分割输入。它对类似 ls -a my_folder 的命令起作用,因为它能够将命令分割为一个列表 ['ls', '-a', 'my_folder'],这样我们便能轻易处理它们了。

然而,也有一些类似 echo "Hello World"echo 'Hello World' 以单引号或双引号引用参数的情况。如果我们使用 cmd.spilt,我们将会得到一个存有 3 个标记的列表 ['echo', '"Hello', 'World"'] 而不是 2 个标记的列表 ['echo', 'Hello World']

幸运的是,Python 提供了一个名为 shlex 的库,它能够帮助我们如魔法般地分割命令。(提示:我们也可以使用正则表达式,但它不是本文的重点。)

import sys
import shlex

...

def tokenize(string):
    return shlex.split(string)

...

然后我们将这些元组发送到执行进程。

步骤 3:执行

这是 shell 中核心而有趣的一部分。当 shell 执行 mkdir test_dir 时,到底发生了什么?(提示: mkdir 是一个带有 test_dir 参数的执行程序,用于创建一个名为 test_dir 的目录。)

execvp 是这一步的首先需要的函数。在我们解释 execvp 所做的事之前,让我们看看它的实际效果。

import os
...

def execute(cmd_tokens):
    ### 执行命令
    os.execvp(cmd_tokens[0], cmd_tokens)

    ### 返回状态以告知在 shell_loop 中等待下一个命令
    return SHELL_STATUS_RUN

...

再次尝试运行我们的 shell,并输入 mkdir test_dir 命令,接着按下回车键。

在我们敲下回车键之后,问题是我们的 shell 会直接退出而不是等待下一个命令。然而,目录正确地创建了。

因此,execvp 实际上做了什么?

execvp 是系统调用 exec 的一个变体。第一个参数是程序名字。v 表示第二个参数是一个程序参数列表(参数数量可变)。p 表示将会使用环境变量 PATH 搜索给定的程序名字。在我们上一次的尝试中,它将会基于我们的 PATH 环境变量查找mkdir 程序。

(还有其他 exec 变体,比如 execv、execvpe、execl、execlp、execlpe;你可以 google 它们获取更多的信息。)

exec 会用即将运行的新进程替换调用进程的当前内存。在我们的例子中,我们的 shell 进程内存会被替换为 mkdir 程序。接着,mkdir 成为主进程并创建 test_dir 目录。最后该进程退出。

这里的重点在于我们的 shell 进程已经被 mkdir 进程所替换。这就是我们的 shell 消失且不会等待下一条命令的原因。

因此,我们需要其他的系统调用来解决问题:fork

fork 会分配新的内存并拷贝当前进程到一个新的进程。我们称这个新的进程为子进程,调用者进程为父进程。然后,子进程内存会被替换为被执行的程序。因此,我们的 shell,也就是父进程,可以免受内存替换的危险。

让我们看看修改的代码。

...

def execute(cmd_tokens):
    ### 分叉一个子 shell 进程
    ### 如果当前进程是子进程,其 `pid` 被设置为 `0`
    ### 否则当前进程是父进程的话,`pid` 的值
    ### 是其子进程的进程 ID。
    pid = os.fork()

    if pid == 0:
    ### 子进程
        ### 用被 exec 调用的程序替换该子进程
        os.execvp(cmd_tokens[0], cmd_tokens)
    elif pid > 0:
    ### 父进程
        while True:
            ### 等待其子进程的响应状态(以进程 ID 来查找)
            wpid, status = os.waitpid(pid, 0)

            ### 当其子进程正常退出时
            ### 或者其被信号中断时,结束等待状态
            if os.WIFEXITED(status) or os.WIFSIGNALED(status):
                break

    ### 返回状态以告知在 shell_loop 中等待下一个命令
    return SHELL_STATUS_RUN

...

当我们的父进程调用 os.fork() 时,你可以想象所有的源代码被拷贝到了新的子进程。此时此刻,父进程和子进程看到的是相同的代码,且并行运行着。

如果运行的代码属于子进程,pid 将为 0。否则,如果运行的代码属于父进程,pid 将会是子进程的进程 id。

os.execvp 在子进程中被调用时,你可以想象子进程的所有源代码被替换为正被调用程序的代码。然而父进程的代码不会被改变。

当父进程完成等待子进程退出或终止时,它会返回一个状态,指示继续 shell 循环。

运行

现在,你可以尝试运行我们的 shell 并输入 mkdir test_dir2。它应该可以正确执行。我们的主 shell 进程仍然存在并等待下一条命令。尝试执行 ls,你可以看到已创建的目录。

但是,这里仍有一些问题。

第一,尝试执行 cd test_dir2,接着执行 ls。它应该会进入到一个空的 test_dir2 目录。然而,你将会看到目录并没有变为 test_dir2

第二,我们仍然没有办法优雅地退出我们的 shell。

我们将会在下篇解决诸如此类的问题。


via: https://hackercollider.com/articles/2016/07/05/create-your-own-shell-in-python-part-1/

作者:Supasate Choochaisri 译者:cposture 校对:wxy

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

简介: 这个新手指南会向你展示如何在 Ubuntu Linux 中修改默认程序

对于我来说,安装 VLC 多媒体播放器安装完 Ubuntu 16.04 该做的事中最先做的几件事之一。为了能够使我双击一个视频就用 VLC 打开,在我安装完 VLC 之后我会设置它为默认程序。

作为一个新手,你需要知道如何在 Ubuntu 中修改任何默认程序,这也是我今天在这篇指南中所要讲的。

在 Ubuntu 中修改默认程序

这里提及的方法适用于所有的 Ubuntu 12.04,Ubuntu 14.04 和Ubuntu 16.04。在 Ubuntu 中,这里有两种基本的方法可以修改默认程序:

  • 通过系统设置
  • 通过右键菜单

1.通过系统设置修改 Ubuntu 的默认程序

进入 Unity 面板并且搜索 系统设置 System Settings

系统设置 System Settings 中,选择 详细选项 Details

在左边的面板中选择 默认程序 Default Applications ,你会发现在右边的面板中可以修改默认程序。

正如看到的那样,这里只有少数几类的默认程序可以被改变。你可以在这里改变浏览器、邮箱客户端、日历、音乐、视频和相册的默认程序。那其他类型的默认程序怎么修改?

不要担心,为了修改其他类型的默认程序,我们会用到右键菜单。

2.通过右键菜单修改默认程序

如果你使用过 Windows 系统,你应该看见过右键菜单的“打开方式”,可以通过这个来修改默认程序。我们在 Ubuntu 中也有相似的方法。

右键一个还没有设置默认打开程序的文件,选择“ 属性 properties

从右键菜单中选择属性

在这里,你可以选择使用什么程序打开,并且设置为默认程序。

在 Ubuntu 中设置打开 WebP 图片的默认程序为 gThumb

小菜一碟不是么?一旦你做完这些,所有同样类型的文件都会用你选择的默认程序打开。

我很希望这个新手指南对你在修改 Ubuntu 的默认程序时有帮助。如果你有任何的疑问或者建议,可以随时在下面评论。


via: https://itsfoss.com/change-default-applications-ubuntu/

作者:Abhishek Prakash 译者:Locez 校对:wxy

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

最新版本的 OpenBSD 6.0 将关闭潜在的安全漏洞——比如其 Linux 兼容层。

OpenBSD,这个 BSD 家族里面最重要的变种之一将在今年九月份发布新的 6.0 版本。它通常被视作 Linux 的一个替代品,以没有专有软件而闻名,并由于其默认情况下比其它的操作系统更安全,以及对用户安全高度警惕而广泛受到赞誉。由于其在开发过程中的安全理念,许多软件路由器和防火墙项目都是基于 OpenBSD 而开发的。

在这次 OpenBSD 新版本中安全相关的最大变化是其移除了对 Linux 模拟的支持。在之前的 OpenBSD 版本中,Linux 应用可以通过一个兼容层直接运行在 BSD 中,但是在最新的 OpenBSD 6.0 的发布公告中称,由于“安全改进”而移走了该子系统。

OpenBSD 中有一些软件是以附加的二进制软件包方式提供的,OpenBSD 的维护者们会尽量提供对这些软件的支持,但是他们不会像对待其操作系统一样对这些软件的安全性进行筛选。由于现在很多流行应用的最新版本都可以直接运行在 OpenBSD 中,比如说 Chromium 和 Firefox 浏览器,这意味没有 Linux 兼容层也不要紧。

出于安全考虑,OpenBSD 还抛弃了 systrace 系统安全实施策略工具。之前版本的 OpenBSD 包括它,但是并没有用它来管理任何重要的东西。systrace视为不安全已经有段时间了,所以在这次的 OpenBSD 发行版中它也将被抛弃。

作为安全增强的一部分,还移除了“usermount”选项,它允许非特权用户挂载文件系统。OpenBSD 项目负责人 Theo de Raadt 说 usermount “允许任何不当的程序调用 mount/umount 系统调用”,这意味着“在提供该功能的前提下,任何用户都没有办法保持其系统的安全性和可靠性的预期。”

在发布于今年三月份的 OpenBSD 的前一个版本 5.9 中,它提供了一些自己的安全改进。比如以特权用户身份运行程序的 sudo 被替换成 doas,这个新的程序使用了更简化和潜在问题更少的配置机制。这种为了安全而做的改变在 Linux 世界会更难见到,而 OpenBSD 则通过让其代码不断采用新的技术而展示了其在安全方面的努力和进步。

美国 国家标准和技术协会 National Institute of Standards and Technology (NIST)发布了《 数字身份验证指南 Digital Authentication Guideline (DAG)》的最新草案,其中暗示将来会禁用基于短信的 双因子认证方案 Two-Factor Authentication (2FA)。

数字身份验证指南 Digital Authentication Guideline (DAG)》是一系列用于软件商构建安全服务的规则,也被政府和私人机构用于评估其服务和软件的安全性。

NIST 的专家们一直不断地更新该指南,以便应对 IT 领域的快速变化。

基于短信的双因子认证仍然可以用,但是不会太久了

最新的《数字身份验证指南》草案,NIST 正式地不建议公司继续使用基于短信的认证,甚至说将来考虑在该指南中将基于短信的双因子认证视作不安全的。NIST 在该草案中说:

“如果使用基于公共移动电话网络的短信作为带外验证,验证者必须验证其预注册的手机号码是基于移动网络的,而非 VoIP(或者其它基于软件的),然后才能发送短信到预注册手机号码。修改预注册手机号码时如果没有双因子验证是不能进行的。不推荐使用短信进行带外验证,本指南的将来版本中将不再允许这种方式。”

NIST 的指南当中认为基于短信的双因子认证是不安全的,因为用户不会总是带着电话。

在该指南中,推荐软件应用应该使用令牌和软件加密验证器,这可能是手机应用或硬件设备的形式,但是就像手机一样,也可能被偷走或“临时借走”。但该指南认为这种风险是可接受的,而不像令牌或软件加密验证器那样,短信在 VoIP 服务之下是一个影响到了联合信任因子的缺陷。

短信是不安全的,特别是在 VoIP 连接下

因为一些 VoIP 服务允许劫持短信,所以 NIST 建议厂商在基于短信的双因子系统在发送短信验证码之前,对使用 VoIP 连接的访问进行特别检查。

短信是一个广泛使用的不安全协议,仅在上周,Context Information Security 的安全研究人员就披露了又一起依赖于短信协议而危及到了其用户和设备的攻击。随着对这种攻击类型的越来越多的研究,软件厂商、公司以及用户会逐渐认识到应该换到更安全的验证方式上。

当前的 NIST 指南仍在讨论之中,但是基本上可以确定,该指南的将来版本不会再将使用基于短信的认证方式推荐为带外验证的安全方式。

生物识别技术是一个新兴发展方向

在该指南草案中,也提到了生物特征识别技术在特定条件下是可以作为一个验证方式的:

“因此,对生物识别技术的验证是支持的,只需要遵循如下准则:生物识别技术应该与其他(你知道的或你拥有的)认证因子配合使用。”