Alan Formy-duval 发布的文章

使用 Lynis 的扫描和报告来发现和修复 Linux 安全问题。

当我读到 Gaurav Kamathe 的文章《使用 Lynis 扫描 Linux 安全性》时,让我想起了我在美国劳工部担任系统管理员的日子。我那时的职责之一是保证我们的 Unix 服务器的安全。每个季度,都会有一个独立的核查员来审查我们服务器的安全状态。每次在核查员预定到达的那一天,我都会运行 Security Readiness Review(SRR),这是一个扫描工具,它使用一大套脚本来识别和报告任何安全线索。SRR 是开源的,因此我可以查看所有源码脚本及其功能。这使我能够查看其代码,确定具体是什么问题,并迅速修复它发现的每个问题。

什么是 Lynis?

Lynis 是一个开源的安全审计工具,它的工作原理和 SRR 很像,它会扫描 Linux 系统,并提供它发现的任何弱点的详细报告。同样和 SRR 一样,它也是由一大套脚本组成的,每个脚本都会检查一个特定的项目,例如,最小和最大密码时间要求。

运行 Lynis 后,你可以使用它的报告来定位每个项目的脚本,并了解 Lynis 是如何检查和报告每个问题的。你也可以使用相同的脚本代码来创建新的代码来自动解决。

如何阅读 Lynis 报告

由于 Gaurav 的文章介绍了 Lynis 的安装和使用,在本文中,我将展示一些如何阅读和使用其报告的例子。

请从运行一次审计开始:

# lynis audit system --quick

完成后,完整的报告将显示在你的屏幕上。在底部,“Suggestions” 部分列出了所有可能需要修复以更好地加固系统的项目,以及每个项目的 TEST-ID。

要想加固系统并减少列表的大小,请开始解决每个项目。在 “Suggestions” 部分的描述可能包含了你需要采取的全部行动。如果没有,你可以使用 show details 命令。

# lynis show details TEST-ID

例如,在我的系统中,有一条建议是:

找不到 locate 所需的数据库,运行 updatedblocate.updatedb 来创建这个文件。[FILE-6410]

看起来我只需要运行 updatedb 命令就行,但如果我想确定一下,我可以使用 Lynis 的 show details 选项。

# lynis show details FILE-6410
2020-06-16 20:54:33 Performing test ID FILE-6410 (Checking Locate database)
2020-06-16 20:54:33 Test: Checking locate database
2020-06-16 20:54:33 Result: file /var/lib/mlocate/mlocate.db not found
2020-06-16 20:54:33 Result: file /var/lib/locate/locatedb not found
2020-06-16 20:54:33 Result: file /var/lib/locatedb not found
2020-06-16 20:54:33 Result: file /var/lib/slocate/slocate.db not found
2020-06-16 20:54:33 Result: file /var/cache/locate/locatedb not found
2020-06-16 20:54:33 Result: file /var/db/locate.database not found
2020-06-16 20:54:33 Result: database not found
2020-06-16 20:54:33 Suggestion: The database required for 'locate' could not be found. Run 'updatedb' or 'locate.updatedb' to create this file. [test:FILE-6410] [details:-] [solution:-]
2020-06-16 20:54:33 ====

这些细节表明 Lynis 无法找到各种文件。这个情况描述的非常清楚。我可以运行 updatedb 命令,然后重新检查这个测试。

# updatedb
# lynis --tests FILE-6410

重新检查细节时,会显示它发现哪个文件满足了测试:

# lynis show details FILE-6410
2020-06-16 21:38:40 Performing test ID FILE-6410 (Checking Locate database)
2020-06-16 21:38:40 Test: Checking locate database
2020-06-16 21:38:40 Result: locate database found (/var/lib/mlocate/mlocate.db)
2020-06-16 21:38:40 Result: file /var/lib/locate/locatedb not found
2020-06-16 21:38:40 Result: file /var/lib/locatedb not found
2020-06-16 21:38:40 Result: file /var/lib/slocate/slocate.db not found
2020-06-16 21:38:40 Result: file /var/cache/locate/locatedb not found
2020-06-16 21:38:40 Result: file /var/db/locate.database not found
2020-06-16 21:38:40 ====

深入挖掘

Lynis 的许多建议并不像这个建议那样直接。如果你不确定某个发现或建议指的是什么,就很难知道如何解决问题。假设你在一个新的 Linux 服务器上运行 Lynis,有几项与 SSH 守护进程有关的内容,其中一项是关于 MaxAuthTries 的设置:

* Consider hardening SSH configuration [SSH-7408]
    - Details  : MaxAuthTries (6 --> 3)
      https://cisofy.com/lynis/controls/SSH-7408/

要解决这个问题,你需要知道 SSH 配置文件的位置。一个经验丰富的 Linux 管理员可能已经知道在哪里找到它们,但如果你不知道,有一个方法可以看到 Lynis 在哪里找到它们。

定位 Lynis 测试脚本

Lynis 支持多种操作系统,因此你的安装位置可能有所不同。在 Red Hat Enterprise Linux 或 Fedora Linux 系统中,使用 rpm 命令来查找测试文件:

# rpm -ql lynis

这将列出所有测试文件,并报告它们在 lynis/include 目录下的位置。在这个目录下搜索你想知道的 TEST-ID(本例中为 SSH-7408):

# grep SSH-7408 /usr/share/lynis/include/*
/usr/share/lynis/include/tests_ssh:    # Test        : SSH-7408

查找 SSH 问题

名为 tests_ssh 的文件中包含了 TEST-ID,在这里可以找到与 SSH 相关的扫描函数。看看这个文件,就可以看到 Lynis 扫描器调用的各种函数。第一部分在一个名为 SSH_DAEMON_CONFIG_LOCS 的变量中定义了一个目录列表。下面几节负责检查 SSH 守护进程的状态、定位它的配置文件,并识别它的版本。我在 SSH-7404 测试中找到了查找配置文件的代码,描述为 “确定 SSH 守护进程配置文件位置”。这段代码包含一个 for 循环,在列表中的项目中搜索一个名为 sshd_config 的文件。我可以用这个逻辑来自己进行搜索:

# find /etc /etc/ssh /usr/local/etc/ssh /opt/csw/etc/ssh -name sshd_config
/etc/ssh/sshd_config
/etc/ssh/sshd_config
find: ‘/usr/local/etc/ssh’: No such file or directory
find: ‘/opt/csw/etc/ssh’: No such file or directory

进一步探索这个文件,就会看到寻找 SSH-7408 的相关代码。这个测试涵盖了 MaxAuthTries 和其他一些设置。现在我可以在 SSH 配置文件中找到该变量:

# grep MaxAuthTries /etc/ssh/sshd_config
#MaxAuthTries 6

修复法律横幅问题

Lynis 还报告了一个与登录系统时显示的法律横幅有关的发现。在我的家庭桌面系统上(我并不希望有很多其他人登录),我没有去改变默认的 issue 文件。企业或政府的系统很可能被要求包含一个法律横幅,以警告用户他们的登录和活动可能被记录和监控。Lynis 用 BANN-7126 测试和 BANN-7130 测试报告了这一点:

* Add a legal banner to /etc/issue, to warn unauthorized users [BANN-7126]
      https://cisofy.com/lynis/controls/BANN-7126/

* Add legal banner to /etc/issue.net, to warn unauthorized users [BANN-7130]
      https://cisofy.com/lynis/controls/BANN-7130/

我在运行 Fedora 32 工作站的系统上没有发现什么:

# cat /etc/issue /etc/issue.net
\S
Kernel \r on an \m (\l)

\S
Kernel \r on an \m (\l)

我可以添加一些诸如 “keep out” 或 “don't break anything” 之类的内容,但测试的描述并没有提供足够的信息来解决这个问题,所以我又看了看 Lynis 的脚本。我注意到 include 目录下有一个叫 tests_banners 的文件;这似乎是一个很好的地方。在 grep 的帮助下,我看到了相关的测试:

# grep -E 'BANN-7126|BANN-7130' /usr/share/lynis/include/tests_banners
    # Test        : BANN-7126
    Register --test-no BANN-7126 --preqs-met ${PREQS_MET} --weight L --network NO --category security --description "Check issue banner file contents"
    # Test        : BANN-7130
    Register --test-no BANN-7130 --preqs-met ${PREQS_MET} --weight L --network NO --category security --description "Check issue.net banner file contents"

在检查了测试文件中的相关代码后,我发现这两个测试都是通过一个 for 循环来迭代一些预定义的法律术语:

for ITEM in ${LEGAL_BANNER_STRINGS}; do

这些法律术语存储在文件顶部定义的变量 LEGAL_BANNER_STRINGS 中。向后滚动到顶部可以看到完整的清单:

LEGAL_BANNER_STRINGS="audit access authori condition connect consent continu criminal enforce evidence forbidden intrusion law legal legislat log monitor owner penal policy policies privacy private prohibited record restricted secure subject system terms warning"

我最初的建议(“keep out” 或 “don't break anything”)不会满足这个测试,因为它们不包含这个列表中的任何单词。

下面这条横幅信息包含了几个必要的词,因此,它将满足这个测试,并防止 Lynis 报告它:

Attention, by continuing to connect to this system, you consent to the owner storing a log of all activity. Unauthorized access is prohibited.

请注意,这条信息必须被添加到 /etc/issue/etc/issue.net 中。

使其可重复

你可以手动进行这些编辑,但你可能要考虑自动化。例如,可能有许多设置需要更改,或者你可能需要在许多服务器上定期进行这些编辑。创建一个加固脚本将是简化这个过程的好方法。对于 SSH 配置,在你的加固脚本中的一些 sed 命令可以解决这些发现。或者,你可以使用 echo 语句来添加合法的横幅。

sed -i '/MaxAuthTries/s/#MaxAuthTries 6/MaxAuthTries 3/' /etc/ssh/sshd_config

echo "Legal Banner" | tee -a /etc/issue /etc/issue.net

自动化使你能够创建一个可重复的脚本,可以在你的基础设施中保存和管理。你也可以在你的初始服务器配置中加入这个脚本。

加固你的系统

这种类型的练习可以提高你的脚本技能,既可以跟着现有的代码走,也可以写自己的脚本。因为 Lynis 是开源的,所以你可以很容易地看到你的系统是如何被检查的,以及它的报告意味着什么。最终的结果将是一个完善的系统,你可以在审计人员来的时候随时向他们炫耀。


via: https://opensource.com/article/20/8/linux-lynis-security

作者:Alan Formy-Duval 选题:lujun9972 译者:wxy 校对:wxy

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

这是一个包含了所有已知 USB 设备 ID 的开源项目。

市场上有成千上万的 USB 设备:键盘、扫描仪、打印机、鼠标和其他无数的设备,都能在 Linux 上工作。它们的供应商详情都存储在 USB ID 仓库中。

lsusb

Linux lsusb 命令列出了连接到系统的 USB 设备的信息,但有时信息不完整。例如,我最近注意到我的一个 USB 设备的品牌没有被识别。设备是可以使用的,但是在列出我所连接的 USB 设备的详情中没有提供任何识别信息。以下是我的 lsusb 命令的输出:

$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 046d:082c Logitech, Inc.
Bus 001 Device 003: ID 0951:16d2 Kingston Technology
Bus 001 Device 002: ID 18f8:1486  
Bus 001 Device 005: ID 051d:0002 American Power Conversion Uninterruptible Power Supply
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

正如你在最后一栏中看到的,有一个设备没有制造商描述。要确定这个设备是什么,我必须对我的 USB 设备树进行更深入的检查。幸运的是,lsusb 命令有更多的选项。其中一个选项是 -D device,来获取每个设备的详细信息,正如手册页面所解释的那样:

“不会扫描 /dev/bus/usb 目录,而只显示给定设备文件所属设备的信息。设备文件应该是类似 /dev/bus/usb/001/001 这样的文件。这个选项会像 v 选项一样显示详细信息,但你必须是 root 用户才行。"

我认为如何将设备路径传递给 lsusb 命令并不容易,但在仔细阅读手册页和初始输出后,我能够确定如何构造它。USB 设备驻留在 UDEV 文件系统中。它们的设备路径始于 USB 设备目录 /dev/bus/usb/。路径的其余部分由设备的总线 ID 和设备 ID 组成。我的无描述设备是 Bus 001 Device 002,被翻译成了 001/002,完成的路径为 /dev/bus/usb/001/002。现在我可以把这个路径传给 lsusb。我还会用管道传给 more,因为这里往往有很多信息:

$ lsusb -D /dev/bus/usb/001/002 |more
Device: ID 18f8:1486  
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.10
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0         8
  idVendor           0x18f8
  idProduct          0x1486
  bcdDevice            1.00
  iManufacturer           0
  iProduct                1
  iSerial                 0
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           59
    bNumInterfaces          2
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0xa0
      (Bus Powered)
      Remote Wakeup
    MaxPower              100mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      1 Boot Interface Subclass
      bInterfaceProtocol      2 Mouse
      iInterface              0
        HID Device Descriptor:

不幸的是,这里并没有提供我希望找到的细节。初始输出中出现的两个字段 idVendoridProduct 都是空的。这有些帮助,因为往下看一下,就会发现 Mouse 这个词。所以,这个设备就是我的鼠标。

USB ID 仓库

这让我不禁想知道如何才能填充这些字段,不仅是为了自己,也是为了其他 Linux 用户。原来已经有了一个开源项目:USB ID 仓库。它是一个公共仓库,它包含了 USB 设备中使用的所有已知 ID。它也被用于各种程序中,包括 USB Utilities,用于显示人类可读的设备名称。

 title=

你可以从网站上或通过下载数据库来浏览特定设备的仓库。也欢迎用户提交新的数据。我要为我的鼠标提交数据,因为它没有在里面。

更新你的 USB ID

USB ID 数据库存储在一个名为 usb.ids 的文件中。这个文件的位置可能会因 Linux 发行版的不同而不同。

在 Ubuntu 18.04 中,这个文件位于 /var/lib/usbutils。要更新数据库,使用命令 update-usbids,你需要用 root 权限或 sudo 来运行。

$ sudo update-usbids

如果有新文件,它就会被下载。当前的文件将被备份,并被替换为新文件:

$ ls -la
total 1148
drwxr-xr-x  2 root root   4096 Jan 15 00:34 .
drwxr-xr-x 85 root root   4096 Nov  7 08:05 ..
-rw-r--r--  1 root root 614379 Jan  9 15:34 usb.ids
-rw-r--r--  1 root root 551472 Jan 15 00:34 usb.ids.old

最新版本的 Fedora Linux 将数据库文件保存在 /usr/share/hwdata 中。而且,没有更新脚本。而是,数据库由一个名为 hwdata 的软件包维护。

# dnf info hwdata

Installed Packages
Name         : hwdata
Version      : 0.332
Release      : 1.fc31
Architecture : noarch
Size         : 7.5 M
Source       : hwdata-0.332-1.fc31.src.rpm
Repository   : @System
From repo    : updates
Summary      : Hardware identification and configuration data
URL          : https://github.com/vcrhonek/hwdata
License      : GPLv2+
Description  : hwdata contains various hardware identification and configuration data,
             : such as the pci.ids and usb.ids databases.

现在我的 USB 设备列表在这个之前未命名的设备旁边显示了一个名字。比较一下上面的输出:

$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 046d:082c Logitech, Inc. HD Webcam C615
Bus 001 Device 003: ID 0951:16d2 Kingston Technology
Bus 001 Device 014: ID 18f8:1486 [Maxxter]
Bus 001 Device 005: ID 051d:0002 American Power Conversion Uninterruptible Power Supply
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

你可能会注意到,随着仓库定期更新新设备和现有设备的详细信息,其他设备的描述也会发生变化。

提交新数据

提交新数据有两种方式:使用网站或通过电子邮件发送特殊格式的补丁文件。在开始之前,我阅读了提交指南。首先,我必须注册一个账户,然后我需要使用项目的提交系统提供我鼠标的 ID 和名称。添加任何 USB 设备的过程都是一样的。

你使用过 USB ID 仓库么?如果有,请在评论中分享你的反馈。


via: https://opensource.com/article/20/8/usb-id-repository

作者:Alan Formy-Duval 选题:lujun9972 译者:geekpi 校对:wxy

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

使用“优化”和它的用户主题扩展来改变你的 Linux UI。

GNOME 是一个相当简单和精简的 Linux 图形用户界面(GUI),很多用户喜欢它的简约外观。虽然它基本上是开箱即用的,但你可以根据自己的喜好来定制 GNOME 。有了 GNOME “优化” 和用户主题扩展,你可以改变顶部栏、窗口标题栏、图标、光标和许多其他 UI 选项的外观。

开始使用

在你改变你的 GNOME 主题之前,你必须安装 “ 优化 Tweaks ” 并启用用户主题扩展。

安装 GNOME “优化”

你可以在 GNOME “软件”中找到“优化”,只需点击一个按钮就可以快速安装。

 title=

如果你喜欢命令行,请使用你的软件包管理器。例如,在 Fedora 或 CentOS 上:

$ sudo dnf install gnome-tweaks

在 Debian 或类似的发行版:

$ sudo apt install gnome-tweaks

启用用户主题

要启用用户主题扩展,启动“优化”并选择“ 扩展 Extensions ”。找到 “用户主题User themes”,点击滑块启用。

 title=

获取主题

现在你已经完成了这些预先条件,你已经准备好寻找和下载一些主题了。一个寻找新主题的好网站是 GNOME-Look.org

在页面的左侧有一个主题类别的列表。当你找到一个你想要的主题,你需要下载它。我直接把 .tar 文件下载到我的家目录下的 .themes 目录(你可能需要先创建这个目录)。

$ mkdir ~/.themes

如果你想让所有用户都能使用这个主题,请把它放在 /usr/share/themes 中。

$ tar xvf theme_archive.tar.xz

下载后,解压压缩包。你可以删除 .tar.xz 文件以节省一些磁盘空间。

应用主题

要应用你的新主题,在“优化”中进入“ 外观 Appearance ”。在这里,你可以为你的桌面的每个方面选择不同的选项。

 title=

多样性是生活的调剂品

自从第一个图形界面面市以来,能够用不同的墙纸、颜色、字体等个性化电脑桌面一直是一个受欢迎的功能。GNOME “优化”和用户主题扩展可以在所有 GNU/Linux 操作系统上的 GNOME 桌面环境中实现这种自定义。而且开源社区还在持续提供广泛的主题、图标、字体和壁纸,任何人都可以下载、尝试和定制。

你最喜欢的 GNOME 主题是什么,你为什么喜欢它们?请在评论中分享。


via: https://opensource.com/article/20/8/gnome-themes

作者:Alan Formy-Duval 选题:lujun9972 译者:geekpi 校对:wxy

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

自 1991 年诞生以来,Linux 已经走了漫长的一段路,而这些事件标志着它的发展。

在 2018 年 8 月,Opensource.com 发布了一项包含七个选项的民意测验,询问读者:Linux 历史上最重要的时刻是什么?我觉得我需要扩大这个清单,并提出我认为的 10 个在塑造 Linux 历史上发挥了重要作用的时刻。

1、Linus 发布 Linux

Linus Torvalds 最初是在 1991 年将 Linux 当成一个业余爱好发布到世上的。结果这个业余爱好成了他的职业!

2、出现 Linux 发行版

1993 年,出现了几个 Linux 发行版,需要特别指出的有 DebianRed HatSlackware。这个时刻之所以重要是因为它们证明了 Linux 在市场认可度和开发水平方面的成就,使其能够在 1990 年代动荡的操作系统战争、浏览器战争和协议战争中生存下来。相反,那时许多成熟的、商业的和专有的产品并没有活过千禧年之交!

3、IBM 斥巨资投注 Linux

2000 年,IBM 宣布将在 Linux 上投资 10 亿美元。Richard Richtmyer 在他的 CNN Money 有关投资的文章 中写道:“这一声明强调了蓝色巨人对 Linux 的承诺,标志着将这个替代操作系统推向主流商业市场的重大进展。”

4、好莱坞接纳 Linux

在 2002 年,整个好莱坞电影业似乎都采用了 Linux。迪尼斯梦工厂工业光魔 都在那一年开始用 Linux 制作电影。

5、Linux 得到政府认可

2003 年,美国政府对 Linux 的接受是它的又一个重要时刻。红帽 Linux 被授予美国防部通用操作环境(COE)认证。这很重要,因为政府(特别是情报和军事机构)对计算机系统有非常严格的要求,以防止攻击和支持国家安全。这为其他机构使用 Linux 打开了大门。在那年晚些时候,美国国家气象局宣布,它将用运行 Linux 的新计算机代替过时的系统。

6、我管理的系统

这个“时刻”确实是我个人经历的集合。随着在 2000 年代我的职业发展,我发现自己管理的几种类型的系统和设备都运行着 Linux。我在 VMware ESX、F5 Big-IP、Check Point UTM Edge、Cisco ASA 和 PIX 这些地方发现了 Linux。这使我意识到 Linux 确实可行并且可以继续存在下去。

7、Ubuntu

2004 年,Mark Shuttleworth 创立了 Canonical,该公司基于 Debian 发行版提供了易于使用的 Linux 桌面:Ubuntu Linux。我认为 Ubuntu Linux 帮助扩展了桌面 Linux 安装基数。从休闲的家庭用户到专业软件开发人员,它使 Linux 出现在更多人面前。

8、Google 的 Linux

Google 发行了两种基于 Linux 内核的操作系统:2008 年中期的 Android 移动操作系统和 2011 年在 Chromebook 上运行的 Chrome OS。在那之后,已经售出了数百万部 Android 手机和 Chromebook。

9、云计算即 Linux

在过去这十年左右的时间里,云计算已经从互联网计算的宏伟愿景变成了我们如何个人和专业地使用计算机的全新方式。云计算领域中的主要参与者都是构建于 Linux 之上的,包括 Amazon Web Services(AWS)Google Cloud Services(GCS)Linode。即使在一些我们不能确信的地方(例如 Microsoft Azure),也很好地支持运行 Linux 工作负载。

10、我的汽车运行着 Linux

你的也一样!许多汽车制造商几年前开始引入 Linux。这导致了名为 汽车级 Linux(AGL) 的协作开源项目的形成。丰田和斯巴鲁等主要汽车制造商已经联合开发基于 Linux 的汽车娱乐、导航和引擎管理系统。

分享你的最爱

这是我从贯穿我的职业生涯的 Linux 文章和事件的档案库中提取出来的主观清单,因此可能还有其他更值得注意的时刻。请分享你的评论吧。


via: https://opensource.com/article/19/4/top-moments-linux-history

作者:Alan Formy-Duval 选题:lujun9972 译者:wxy 校对:wxy

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

这个新的系统服务可以使你的生活更轻松。

在过去的十年中,固态驱动器(SSD)带来了一种管理存储的新方法。与上一代的转盘产品相比,SSD 具有无声、更冷却的操作和更快的接口规格等优点。当然,新技术带来了新的维护和管理方法。SSD 具有一种称为 TRIM 的功能。从本质上讲,这是一种用于回收设备上未使用的块的方法,该块可能先前已被写入,但不再包含有效数据,因此可以返回到通用存储池以供重用。Opensource.com 的 Don Watkins 首先在其 2017 年的文章《Linux 固态驱动器:为 SSD 启用 TRIM》中介绍过 TRIM 的内容。

如果你一直在 Linux 系统上使用此功能,则你可能熟悉下面描述的两种方法。

老的方式

丢弃选项

我最初使用 mount 命令的 discard 选项启用了此功能。每个文件系统的配置都放在 /etc/fstab 文件中。

# cat /etc/fstab
UUID=3453g54-6628-2346-8123435f  /home  xfs  defaults,discard   0 0

丢弃选项可启用自动的在线 TRIM。由于可能会对性能造成负面影响,最近关于这是否是最佳方法一直存在争议。使用此选项会在每次将新数据写入驱动器时启动 TRIM。这可能会引入其他磁盘活动,从而影响存储性能。

Cron 作业

我从 fstab 文件中删除了丢弃选项。然后,我创建了一个 cron 作业来按计划调用该命令。

# crontab -l
@midnight /usr/bin/trim

这是我最近在 Ubuntu Linux 系统上使用的方法,直到我了解到另一种方法。

一个新的 TRIM 服务

我最近发现有一个用于 TRIM 的 systemd 服务。Fedora 在版本 30 中将其引入,尽管默认情况下在版本 30 和 31 中未启用它,但计划在版本 32 中使用它。如果你使用的是 Fedora 工作站 31,并且你想要开始使用此功能,可以非常轻松地启用它。我还将在下面向你展示如何对其进行测试。该服务并非 Fedora 独有的服务。它是否存在及其地位将因发行版而异。

测试

我喜欢先进行测试,以更好地了解幕后情况。我通过打开终端并发出配置服务调用的命令来执行此操作。

/usr/sbin/fstrim --fstab --verbose --quiet

fstrim-help 参数将描述这些信息和其他参数。

$ sudo /usr/sbin/fstrim --help

Usage:
 fstrim [options] <mount point>

Discard unused blocks on a mounted filesystem.

Options:
 -a, --all           trim all supported mounted filesystems
 -A, --fstab         trim all supported mounted filesystems from /etc/fstab
 -o, --offset <num>  the offset in bytes to start discarding from
 -l, --length <num>  the number of bytes to discard
 -m, --minimum <num> the minimum extent length to discard
 -v, --verbose       print number of discarded bytes
     --quiet         suppress error messages
 -n, --dry-run       does everything, but trim

 -h, --help          display this help
 -V, --version       display version

因此,现在我可以看到这个 systemd 服务已配置为在我的 /etc/fstab 文件中的所有受支持的挂载文件系统上运行该修剪操作(-fstab),并打印出所丢弃的字节数(-verbose),但是抑制了任何可能会发生的错误消息(–quiet)。了解这些选项对测试很有帮助。例如,我可以从最安全的方法开始,即空运行。我还将去掉 -quiet 参数,以便确定驱动器设置是否发生任何错误。

$ sudo /usr/sbin/fstrim --fstab --verbose --dry-run

这就会显示 fstrim 命令根据在 /etc/fstab 文件中找到的文件系统要执行的操作。

$ sudo /usr/sbin/fstrim --fstab --verbose

现在,这会将 TRIM 操作发送到驱动器,并报告每个文件系统中丢弃的字节数。以下是我最近在新的 NVME SSD 上全新安装 Fedora 之后的示例。

/home: 291.5 GiB (313011310592 bytes) trimmed on /dev/mapper/wkst-home
/boot/efi: 579.2 MiB (607301632 bytes) trimmed on /dev/nvme0n1p1
/boot: 787.5 MiB (825778176 bytes) trimmed on /dev/nvme0n1p2
/: 60.7 GiB (65154805760 bytes) trimmed on /dev/mapper/wkst-root

启用

Fedora Linux 实现了一个计划每周运行它的 systemd 计时器服务。要检查其是否存在及当前状态,请运行 systemctl status

$ sudo systemctl status fstrim.timer

现在,启用该服务。

$ sudo systemctl enable fstrim.timer

验证

然后,你可以通过列出所有计时器来验证该计时器是否已启用。

$ sudo systemctl list-timers --all

会显示出下列行,表明 fstrim.timer 存在。注意,该计时器实际上激活了 fstrim.service 服务。这是实际调用 fstrim 的地方。与时间相关的字段显示为 n/a,因为该服务已启用且尚未运行。

NEXT   LEFT    LAST   PASSED   UNIT           ACTIVATES
n/a    n/a     n/a    n/a      fstrim.timer   fstrim.service

结论

该服务似乎是在驱动器上运行 TRIM 的最佳方法。这比必须创建自己的 crontab 条目来调用 fstrim 命令要简单得多。不必编辑 fstab 文件也更安全。观察固态存储技术的发展很有趣,并且我很高兴看到 Linux 似乎正在朝着标准且安全的方向实现它。

在本文中,学习了固态驱动器与传统硬盘驱动器有何不同以及它的含义…


via: https://opensource.com/article/20/2/trim-solid-state-storage-linux

作者:Alan Formy-Duval 选题:lujun9972 译者:wxy 校对:wxy

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

使用 useradd 命令来添加用户(并且根据需要修改账号)。

任何计算机系统中,添加用户都是最重要的事之一;本文着重介绍如何在 Linux 系统中添加用户。

正式开始之前,我先提三个概念。首先,跟大多数操作系统一样,Linux 用户也需要一个账号才能登录。本文只介绍本地账号,不涉及网络账号,如 LDAP。其次,每个账号都有一个名字(username)和一个对应的数字(用户 ID)。最后,每个用户通常都在一个组内,每个组都有一个名字和一个组 ID。

你可能已经想到了,Linux 提供了添加用户的命令行工具,就是 useradd 命令。有些版本也叫 adduser。为了方便使用,很多发行版上这个命令是一个指向 useradd 命令的符号链接。

$ file `which adduser`
/usr/sbin/adduser: symbolic link to useradd

来看一下 useradd

注意:本文描述的默认环境是 Red Hat Enterprise Linux 8.0。你可能会发现本文描述的这些文件和某些默认值与某些 Linux 发行版或其他 Unix 操作系统(FreeBSD 或 Solaris)偶尔会有差异。

默认处理

useradd 的基本用法相当简单:提供一个用户名就可以添加一个用户。

$ sudo useradd sonny

在本例中,useradd 命令创建了一个名为 sonny 的账号。此命令同时创建了一个同名的组,sonny 被放进了这个组,这个组也是 sonny 账号的主组。命令执行时,根据配置文件 /etc/default/useradd/etc/login.defs 中的不同设置,也会有其他的参数,如语言和 shell。对于一个私人系统或微小的单服务商业环境,这些参数已经足够了。

上面两个文件控制 useradd 的处理,用户的信息保存在 /etc 目录下的一些其他文件中,关于这些信息的讲解会贯穿全文。

文件描述域 (加粗的表示由 useradd 命令设置)
passwd存储用户账号信息用户名:未使用:UID:GID:备注:家目录:shell
shadow存储用户账号的安全信息用户名:加密密码:上次修改时间:最短使用天数:最长使用天数间:修改前警示天数:过期后宽限时间:未使用
group存储组信息组名:未使用:GID:成员列表

自定义处理

当管理员需要更好地控制账号时,可以使用命令行来自定义,如指定一个用户的 ID。

用户和组 ID

默认情况下,useradd 试图使用相同的用户 ID(UID)和主组 ID(GID),但也不完全是。虽然 UID 与 GID 相同不是必须的,但如果相同,会更方便管理员管理。

下面的场景就是一个 GID 与 UID 不同的例子。现在我添加另一账号,名为 Timmy。通过使用 getent 命令来比较 sonnytimmy 两个账号,显示两个用户和对应的主组。

$ getent passwd sonny timmy
sonny:x:1001:1002:Sonny:/home/sonny:/bin/bash
timmy:x:1002:1003::/home/timmy:/bin/bash

$ getent group sonny timmy
sonny:x:1002:
timmy:x:1003:

不幸的是,两者的 UID 和 GID 都不相同。因为默认的处理是,创建用户时,把下一个可用的 UID 赋给用户,然后把同一个数字作为主组 ID 赋给它。然而,当要使用的组 ID 已经被使用时,就再把下一个可用的 GID 赋给它。为了弄清细节,我猜想 1001 这个 GID 已经被使用了,用一个命令确认了一下。

$ getent group 1001
book:x:1001:alan

book 的 ID 是 1001,因此新创建的用户的 GID 都有偏移量 1。这就是为什么系统管理员在用户创建过程中需要多设置一些值的一个实例。为了解决这个问题,我必须先确定下一个可用的 UID 和 GID 是否相同。确定下一个可用值时,可以使用 getent groupgetent passwd 命令,通过 -u 参数传递要确认的值。

$ sudo useradd -u 1004 bobby

$ getent passwd bobby; getent group bobby
bobby:x:1004:1004::/home/bobby:/bin/bash
bobby:x:1004:

另一个需要指定 ID 的场景是,通过 NFS 访问远程系统上的文件时。对于一个给定的用户,当 NFS 所有客户端和服务系统的 ID 都一样时,管理员更容易控制。在我的文章 使用 autofs 挂载 NFS 中有详细介绍。

更多自定义

一些其他的指定用户信息的参数也用得比较频繁。这里是一些你会经常用到的参数的概括例子。

注释

注释选项是通过 -c 参数指定的一个解释文本字段,可以提供一段简短的描述或其他信息。

$ sudo useradd -c "Bailey is cool" bailey
$ getent passwd bailey
bailey:x:1011:1011:Bailey is cool:/home/bailey:/bin/bash

一个用户可以被指定一个主组和多个次组。-g 参数指定主组名称或 GID。如果不指定,useradd 会以用户名创建一个主组(前面演示过)。-G(大写)参数用一个逗号分隔的组列表来指定此用户所属的组,这些组就是次组。

$ sudo useradd -G tgroup,fgroup,libvirt milly
$ id milly
uid=1012(milly) gid=1012(milly) groups=1012(milly),981(libvirt),4000(fgroup),3000(tgroup)

家目录

useradd 的默认处理是,在 /home 目录下创建用户的家目录。然而,下面的参数可以改写家目录的基础目录。-b 设置另一个可以创建家目录的基础目录。例如指定 /home2 而不是 /home

$ sudo useradd -b /home2 vicky
$ getent passwd vicky
vicky:x:1013:1013::/home2/vicky:/bin/bash

-d 参数可以指定一个与用户名不同的家目录。

$ sudo useradd -d /home/ben jerry
$ getent passwd jerry
jerry:x:1014:1014::/home/ben:/bin/bash

目录模板

指定 -k 参数会在创建新用户时,复制 /etc/skel 目录下的所有文件到用户的家目录中。这些文件通常是 shell 配置文件,当然也可以是系统管理员想在新建用户时使用的任何文件。

Shell

-s 参数可以指定 shell。如果不指定,则使用默认的 shell。例如,下面的例子中 ,配置文件中定义的 shell 是 bash,但 wally 这个用户指定的是 zsh

SHELL=/bin/bash

$ sudo useradd -s /usr/bin/zsh wally
$ getent passwd wally
wally:x:1004:1004::/home/wally:/usr/bin/zsh

安全

安全是用户管理的重中之重,因此 useradd 命令也提供了很多关于安全的选项。可以使用 -e 参数,以 YYYY-MM-DD 的格式指定一个用户的过期时间。

$ sudo useradd -e 20191231 sammy
$ sudo getent shadow sammy
sammy:!!:18171:0:99999:7::20191231:

当密码过期时,账号也会自动失效。-f 参数指定密码过期后经过几天账号失效。如果设为 0,则立即失效。

$ sudo useradd -f 30 willy
$ sudo getent shadow willy
willy:!!:18171:0:99999:7:30::

实例

生产环境中,创建一个用户账号时会用到多个参数。例如,我要创建一个 Perry 账号,可能会用下面的命令:

$ sudo useradd -u 1020 -c "Perry Example" \
-G tgroup -b /home2 \
-s /usr/bin/zsh \
-e 20201201 -f 5 perry

查看前面的内容来理解每个选项。用下面的命令确认结果:

$ getent passwd perry; getent group perry; getent shadow perry; id perry
perry:x:1020:1020:Perry Example:/home2/perry:/usr/bin/zsh
perry:x:1020:
perry:!!:18171:0:99999:7:5:20201201:
uid=1020(perry) gid=1020(perry) groups=1020(perry),3000(tgroup)

一点小建议

useradd 命令是所有 Unix(不仅仅是 Linux)系统管理员都必知必会的命令。由于用户创建不能出错,需要第一次就正确,所以理解它的每一个选项很重要。这意味着你需要有一套深思熟虑的命名约定,包括为整个企业环境而不仅仅是一个单系统预留一个专用的 UID/GID 范围,尤其是你为一个成长中的组织工作时。


via: https://opensource.com/article/19/10/linux-useradd-command

作者:Alan Formy-Duval 选题:lujun9972 译者:lxbwolf 校对:wxy

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