通过使用网络绑定磁盘加密（NBDE），无需手动输入密码即可打开加密磁盘。从安全的角度来看，对敏感数据进行加密以保护其免受窥探和黑客的攻击是很重要的。 Linux 统一密钥设置 Linux Unified Key Setup （LUKS）是一个很好的工具，也是 Linux 磁盘加密的通用标准。因为它将所有相关的设置信息存储在分区头部中，所以它使数据迁移变得简单。要使用 LUKS 配置加密磁盘或分区，你需要使用 cryptsetup 工具。不幸的是，加密磁盘的一个缺点是，每次系统重启或磁盘重新挂载时，你都必须手动提供密码。然而， 网络绑定磁盘加密 Network-Bound Disk Encryption （NBDE） 可以在没有任何用户干预的情况下自动安全地解锁加密磁盘。它可以在一些 Linux 发行版中使用，包括从 Red Hat Enterprise Linux 7.4、CentOS 7.4 和 Fedora 24 开始，以及之后的后续版本。NBDE 采用以下技术实现：Clevis 框架：一个可插拔的框架工具，可自动解密和解锁 LUKS 卷Tang 服务器：用于将加密密钥绑定到网络状态的服务Tang 向 Clevis 客户端提供加密密钥。据 Tang 的开发人员介绍，这为密钥托管服务提供了一个安全、无状态、匿名的替代方案。由于 NBDE 使用客户端-服务器架构，你必须同时配置客户端和服务器。你可以在你的本地网络上使用一个虚拟机作为 Tang 服务器。服务器安装用 sudo 安装 Tang：sudo yum install tang -y 启用 Tang 服务器：sudo systemctl enable tangd.socket --now Tang 服务器工作在 80 端口，需加入到 firewalld 防火墙。添加相应的 firewalld 规则：sudo firewall-cmd --add-port=tcp/80 --perm sudo firewall-cmd --reload 现在安装好了服务器。客户端安装在本例中，假设你已经添加了一个名为 /dev/vdc 的新的 1GB 磁盘到你的系统中。使用 fdisk 或 parted 创建主分区：sudo fdisk /dev/vdc 完成以下步骤来安装客户端：Welcome to fdisk (util-linux 2.23.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Device does not contain a recognized partition table Building a new DOS disklabel with disk identifier 0x4a6812d4. Command (m for help): 输入 n 来创建新的分区：Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): 按下回车键选择主分区：Using default response p Partition number (1-4, default 1): 按下回车键选择默认分区号：First sector (2048-2097151, default 2048): Using default value 2048 Last sector, +sectors or +size{K,M,G} (2048-2097151, default 2097151): 按回车键选择最后一个扇区：Using default value 2097151 Partition 1 of type Linux and of size 1023 MiB is set Command (m for help): wq 输入 wq 保存更改并退出 fdisk：The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. 运行 partprobe 通知系统分区表的变化：sudo partprobe 使用 sudo 安装 cryptsetup 软件包：sudo yum install cryptsetup -y 使用 cryptsetup luksFormat 命令对磁盘进行加密。当提示时，你需要输入大写的 YES，并输入密码来加密磁盘：sudo cryptsetup luksFormat /dev/vdc1 WARNING! ======== This will overwrite data on /dev/vdc1 irrevocably. Are you sure? (Type uppercase yes): Enter passphrase for /dev/vdc1: Verify passphrase: 使用 cryptsetup luksOpen 命令将加密的分区映射到一个逻辑设备上。例如，使用 encryptedvdc1 作为名称。你还需要再次输入密码：sudo cryptsetup luksOpen /dev/vdc1 encryptedvdc1 Enter passphrase for /dev/vdc1: 加密分区现在在 /dev/mapper/encryptedvdc1 中可用。在加密的分区上创建一个 XFS 文件系统：sudo mkfs.xfs /dev/mapper/encryptedvdc1 创建一个挂载加密分区的目录：sudo mkdir /encrypted 使用 cryptsetup luksClose 命令锁定分区：cryptsetup luksClose encryptedvdc1 使用 sudo 安装 Clevis 软件包：sudo yum install clevis clevis-luks clevis-dracut -y 修改 /etc/crypttab，在启动时打开加密卷：sudo vim /etc/crypttab 增加以下一行：encryptedvdc1 /dev/vdc1 none _netdev 修改 /etc/fstab，在重启时或启动时自动挂载加密卷：sudo vim /etc/fstab 增加以下一行：/dev/mapper/encryptedvdc1 /encrypted xfs _netdev 1 2 在这个例子中，假设 Tang 服务器的 IP 地址是 192.168.1.20。如果你喜欢，也可以使用主机名或域名。运行以下 clevis 命令：sudo clevis bind luks -d /dev/vdc1 tang '{"url":"http://192.168.1.20"}' The advertisement contains the following signing keys: rwA2BAITfYLuyNiIeYUMBzkhk7M Do you wish to trust these keys? [ynYN] Y Enter existing LUKS password: 输入 Y 接受 Tang 服务器的密钥，并提供现有的 LUKS 密码进行初始设置。通过 systemctl 启用 clevis-luks-askpass.path，以防止非根分区被提示输入密码。sudo systemctl enable clevis-luks-askpass.path 客户端已经安装完毕。现在，每当你重启服务器时，加密后的磁盘应该会自动解密，并通过 Tang 服务器取回密钥进行挂载。如果 Tang 服务器因为任何原因不可用，你需要手动提供密码，才能解密和挂载分区。via: https://opensource.com/article/20/11/nbde-linux作者：Curt Warfield 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
有时你无法从本地连接到 SSH 服务器。还有时，你可能想为 SSH 连接添加额外的安全层。在这些情况下，通过代理服务器连接到 SSH 服务器是一种解决方式。Squid 是提供缓存和代理服务的全功能代理服务器应用。它通常用于在浏览过程中重用和缓存以前请求的网页来帮助缩短响应时间并减少网络带宽。但是在本篇中，你将配置 Squid 作为 SSH 代理服务器，因为它是强大的受信任代理服务器，易于配置。安装和配置使用 sudo 安装 squid 软件包：$ sudo dnf install squid -y squid 配置文件非常庞大，但是我们只需要配置其中一些。Squid 使用访问控制列表来管理连接。编辑 /etc/squid/squid.conf 文件，确保你有下面解释的两行。首先，指定你的本地 IP 网络。默认配置文件已经列出了最常用的，但是如果没有，你需要添加你的配置。例如，如果你的本地 IP 网络范围是 192.168.1.X，那么这行会是这样：acl localnet src 192.168.1.0/24 接下来，添加以下行，将 SSH 端口添加为安全端口：acl Safe_ports port 22 保存该文件。现在启用并重启 squid 代理服务：$ sudo systemctl enable squid $ sudo systemctl restart squid squid 代理默认监听 3128 端口。配置 firewalld 允许此服务：$ sudo firewall-cmd --add-service=squid --perm $ sudo firewall-cmd --reload 测试 ssh 代理连接要通过 ssh 代理服务器连接到服务器，我们将使用 netcat。如果尚未安装 nmap-ncat，请安装它：$ sudo dnf install nmap-ncat -y 这是标准 ssh 连接示例：$ ssh user@example.com 这是使用 squid 代理服务器作为网关连接到该服务器的方式。此示例假定 squid 代理服务器的 IP 地址为 192.168.1.63。你还可以使用 squid 代理服务器的主机名或 FQDN：$ ssh user@example.com -o "ProxyCommand nc --proxy 192.168.1.63:3128 %h %p" 以下是这些选项的含义：ProxyCommand – 告诉 ssh 使用代理命令。nc – 用于建立与代理服务器连接的命令。这是 netcat 命令。%h – 代理服务器的主机名或 IP 地址的占位符。%p – 代理服务器端口号的占位符。有很多方法可以配置 SSH 代理服务器，但这是入门​​的简单方法。via: https://fedoramagazine.org/configure-ssh-proxy-server/作者：Curt Warfield 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
如果你想在一个媒体项目中用到了多个磁盘或分区，不想丢失任何现有数据，但又想将所有文件都存放在一个驱动器下，该怎么办？这时，mergefs 就能派上用场！mergerfs 是一个联合文件系统，旨在简化存储和管理众多商业存储设备上的文件。你需要从他们的 GitHub 页面获取最新的 RPM。Fedora 的版本名称中带有 “fc” 和版本号。例如，这是 Fedora 31 的版本： mergerfs-2.29.0-1.fc31.x86\_64.rpm。安装和配置 mergefs使用 sudo 安装已下载的 mergefs 软件包：$ sudo dnf install mergerfs-2.29.0-1.fc31.x86_64.rpm现在，你可以将多个磁盘挂载为一个驱动器。如果你有一台媒体服务器，并且希望所有媒体文件都显示在一个地方，这将很方便。如果将新文件上传到系统，那么可以将它们复制到 mergefs 目录，mergefs 会自动将它们复制具有足够可用空间的磁盘上。这是使你更容易理解的例子：$ df -hT | grep disk /dev/sdb1 ext4 23M 386K 21M 2% /disk1 /dev/sdc1 ext4 44M 1.1M 40M 3% /disk2 $ ls -l /disk1/Videos/ total 1 -rw-r--r--. 1 curt curt 0 Mar 8 17:17 Our Wedding.mkv $ ls -l /disk2/Videos/ total 2 -rw-r--r--. 1 curt curt 0 Mar 8 17:17 Baby's first Xmas.mkv -rw-rw-r--. 1 curt curt 0 Mar 8 17:21 Halloween hijinks.mkv在此例中挂载了两块磁盘，分别为 disk1 和 disk2。两个驱动器都有一个包含文件的 Videos 目录。现在，我们将使用 mergefs 挂载这些驱动器，使它们看起来像一个更大的驱动器。$ sudo mergerfs -o defaults,allow_other,use_ino,category.create=mfs,moveonenospc=true,minfreespace=1M /disk1:/disk2 /mediamergefs 手册页非常庞杂，因此我们将说明上面提到的选项。defaults：除非指定，否则将使用默认设置。allow_other：允许 sudo 或 root 以外的用户查看文件系统。use_ino：让 mergefs 提供文件/目录 inode 而不是 libfuse。虽然不是默认值，但建议你启用它，以便链接的文件共享相同的 inode 值。category.create=mfs：根据可用空间在驱动器间传播文件。moveonenospc=true：如果启用，那么如果写入失败，将进行扫描以查找具有最大可用空间的驱动器。minfreespace=1M：最小使用空间值。disk1：第一块硬盘。disk2：第二块硬盘。/media：挂载驱动器的目录。看起来是这样的：$ df -hT | grep disk /dev/sdb1 ext4 23M 386K 21M 2% /disk1 /dev/sdc1 ext4 44M 1.1M 40M 3% /disk2 $ df -hT | grep media 1:2 fuse.mergerfs 66M 1.4M 60M 3% /media你可以看到现在 mergefs 挂载显示的总容量为 66M，这是两块硬盘的总容量。继续示例：有一个叫 Baby's second Xmas.mkv 的 30M 视频。让我们将其复制到用 mergerfs 挂载的 /media 文件夹中。$ ls -lh "Baby's second Xmas.mkv" -rw-rw-r--. 1 curt curt 30M Apr 20 08:45 Baby's second Xmas.mkv $ cp "Baby's second Xmas.mkv" /media/Videos/这是最终结果：$ df -hT | grep disk /dev/sdb1 ext4 23M 386K 21M 2% /disk1 /dev/sdc1 ext4 44M 31M 9.8M 76% /disk2 $ df -hT | grep media 1:2 fuse.mergerfs 66M 31M 30M 51% /media从磁盘空间利用率中可以看到，因为 disk1 没有足够的可用空间，所以 mergefs 自动将文件复制到 disk2。这是所有文件详情：$ ls -l /disk1/Videos/ total 1 -rw-r--r--. 1 curt curt 0 Mar 8 17:17 Our Wedding.mkv $ ls -l /disk2/Videos/ total 30003 -rw-r--r--. 1 curt curt 0 Mar 8 17:17 Baby's first Xmas.mkv -rw-rw-r--. 1 curt curt 30720000 Apr 20 08:47 Baby's second Xmas.mkv -rw-rw-r--. 1 curt curt 0 Mar 8 17:21 Halloween hijinks.mkv $ ls -l /media/Videos/ total 30004 -rw-r--r--. 1 curt curt 0 Mar 8 17:17 Baby's first Xmas.mkv -rw-rw-r--. 1 curt curt 30720000 Apr 20 08:47 Baby's second Xmas.mkv -rw-rw-r--. 1 curt curt 0 Mar 8 17:21 Halloween hijinks.mkv -rw-r--r--. 1 curt curt 0 Mar 8 17:17 Our Wedding.mkv当你将文件复制到 mergefs 挂载点时，它将始终将文件复制到有足够可用空间的硬盘上。如果池中的所有驱动器都没有足够的可用空间，那么你将无法复制它们。via: https://fedoramagazine.org/using-mergerfs-to-increase-your-virtual-storage/作者：Curt Warfield 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
域名系统 Domain Name System ，我们更通常称为 DNS 的系统，可以将域名翻译或转换为与该域关联的 IP 地址。DNS 是能够让你通过名称找到自己喜欢的网站而不是在浏览器中输入 IP 地址的原因。本指南将向你展示如何配置一个主 DNS 系统以及客户端。以下是本文示例中使用的系统细节：dns01.fedora.local （192.168.1.160）- 主 DNS 服务器 client.fedora.local （192.168.1.136）- 客户端DNS 服务器配置使用 sudo 安装 bind 包：$ sudo dnf install bind bind-utils -ybind 包提供了 /etc/named.conf 配置文件，来供你配置 DNS 服务器。编辑 /etc/named.conf 文件：sudo vi /etc/named.conf查找以下行：listen-on port 53 { 127.0.0.1; };添加主 DNS 服务器的 IP 地址，如下所示：listen-on port 53 { 127.0.0.1; 192.168.1.160; };查找以下行：allow-query { localhost; };添加本地网络范围。该示例系统使用的 IP 地址在 192.168.1.X 的范围内。指定如下：allow-query { localhost; 192.168.1.0/24; };指定转发和反向区域。 区域文件 Zone file 就是具有系统上 DNS 信息（例如 IP 地址和主机名）的文本文件。 转发区域文件 forward zone file 使得将主机名转换为 IP 地址成为可能。 反向区域文件 reverse zone file 则相反。它允许远程系统将 IP 地址转换为主机名。在 /etc/named.conf 文件的底部查找以下行：include "/etc/named.rfc1912.zones";在此处，你将在该行的正上方指定区域文件信息，如下所示：zone "dns01.fedora.local" IN { type master; file "forward.fedora.local"; allow-update { none; }; }; zone "1.168.192.in-addr.arpa" IN { type master; file "reverse.fedora.local"; allow-update { none; }; };forward.fedora.local 和 reverse.fedora.local 文件是要创建的区域文件的名称。它们可以是任意名字。保存并退出。创建区域文件创建你在 /etc/named.conf 文件中指定的转发和反向区域文件：$ sudo vi /var/named/forward.fedora.local添加以下行：$TTL 86400 @ IN SOA dns01.fedora.local. root.fedora.local. ( 2011071001 ;Serial 3600 ;Refresh 1800 ;Retry 604800 ;Expire 86400 ;Minimum TTL ) @ IN NS dns01.fedora.local. @ IN A 192.168.1.160 dns01 IN A 192.168.1.160 client IN A 192.168.1.136所有粗体（LCTT 译注：本译文中无法呈现粗体）内容都特定于你的环境。保存文件并退出。接下来，编辑 reverse.fedora.local 文件：$ sudo vi /var/named/reverse.fedora.local添加以下行：$TTL 86400 @ IN SOA dns01.fedora.local. root.fedora.local. ( 2011071001 ;Serial 3600 ;Refresh 1800 ;Retry 604800 ;Expire 86400 ;Minimum TTL ) @ IN NS dns01.fedora.local. @ IN PTR fedora.local. dns01 IN A 192.168.1.160 client IN A 192.168.1.136 160 IN PTR dns01.fedora.local. 136 IN PTR client.fedora.local.所有粗体（LCTT 译注：本译文中无法呈现粗体）内容都特定于你的环境。保存文件并退出。你还需要配置 SELinux 并为配置文件添加正确的所有权。sudo chgrp named -R /var/named sudo chown -v root:named /etc/named.conf sudo restorecon -rv /var/named sudo restorecon /etc/named.conf配置防火墙：sudo firewall-cmd --add-service=dns --perm sudo firewall-cmd --reload检查配置是否存在语法错误sudo named-checkconf /etc/named.conf如果没有输出或返回错误，那么你的配置有效。检查转发和反向区域文件。$ sudo named-checkzone forward.fedora.local /var/named/forward.fedora.local $ sudo named-checkzone reverse.fedora.local /var/named/reverse.fedora.local你应该看到 “OK” 的响应：zone forward.fedora.local/IN: loaded serial 2011071001 OK zone reverse.fedora.local/IN: loaded serial 2011071001 OK启用并启动 DNS 服务$ sudo systemctl enable named $ sudo systemctl start named配置 resolv.conf 文件编辑 /etc/resolv.conf 文件：$ sudo vi /etc/resolv.conf查找你当前的 nameserver 行。在示例系统上，使用调制解调器/路由器充当名称服务器，因此当前看起来像这样：nameserver 192.168.1.1这需要更改为主 DNS 服务器的 IP 地址：nameserver 192.168.1.160保存更改并退出。不幸的是需要注意一点。如果系统重启或网络重启，那么 NetworkManager 会覆盖 /etc/resolv.conf 文件。这意味着你将丢失所做的所有更改。为了防止这种情况发生，请将 /etc/resolv.conf 设为不可变：$ sudo chattr +i /etc/resolv.conf如果要重新设置，就需要允许其再次被覆盖：$ sudo chattr -i /etc/resolv.conf测试 DNS 服务器$ dig fedoramagazine.org; <<>> DiG 9.11.13-RedHat-9.11.13-2.fc30 <<>> fedoramagazine.org ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8391 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 6 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ; COOKIE: c7350d07f8efaa1286c670ab5e13482d600f82274871195a (good) ;; QUESTION SECTION: ;fedoramagazine.org. IN A ;; ANSWER SECTION: fedoramagazine.org. 50 IN A 35.197.52.145 ;; AUTHORITY SECTION: fedoramagazine.org. 86150 IN NS ns05.fedoraproject.org. fedoramagazine.org. 86150 IN NS ns02.fedoraproject.org. fedoramagazine.org. 86150 IN NS ns04.fedoraproject.org. ;; ADDITIONAL SECTION: ns02.fedoraproject.org. 86150 IN A 152.19.134.139 ns04.fedoraproject.org. 86150 IN A 209.132.181.17 ns05.fedoraproject.org. 86150 IN A 85.236.55.10 ns02.fedoraproject.org. 86150 IN AAAA 2610:28:3090:3001:dead:beef:cafe:fed5 ns05.fedoraproject.org. 86150 IN AAAA 2001:4178:2:1269:dead:beef:cafe:fed5 ;; Query time: 830 msec ;; SERVER: 192.168.1.160#53(192.168.1.160) ;; WHEN: Mon Jan 06 08:46:05 CST 2020 ;; MSG SIZE rcvd: 266需要检查几件事以验证 DNS 服务器是否正常运行。显然，取得结果很重要，但这本身并不意味着 DNS 服务器实际上正常工作。顶部的 QUERY、ANSWER 和 AUTHORITY 字段应显示为非零，如我们的示例所示：;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 6并且 SERVER 字段应有你的 DNS 服务器的 IP 地址：;; SERVER: 192.168.1.160#53(192.168.1.160)如果这是你第一次运行 dig 命令，请注意完成查询要花费 830 毫秒的时间：;; Query time: 830 msec如果再次运行它，查询将会更快：$ dig fedoramagazine.org;; Query time: 0 msec ;; SERVER: 192.168.1.160#53(192.168.1.160)客户端配置客户端配置将简单得多。安装 bind 程序：$ sudo dnf install bind-utils -y编辑 /etc/resolv.conf 文件，并将主 DNS 配置为唯一的名称服务器：$ sudo vi /etc/resolv.conf它看起来像这样：nameserver 192.168.1.160保存更改并退出。然后，使 /etc/resolv.conf 文件不可变，防止其被覆盖并变回默认设置：$ sudo chattr +i /etc/resolv.conf测试客户端你应该获得与 DNS 服务器相同的结果：$ dig fedoramagazine.org; <<>> DiG 9.11.13-RedHat-9.11.13-2.fc30 <<>> fedoramagazine.org ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8391 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 6 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ; COOKIE: c7350d07f8efaa1286c670ab5e13482d600f82274871195a (good) ;; QUESTION SECTION: ;fedoramagazine.org. IN A ;; ANSWER SECTION: fedoramagazine.org. 50 IN A 35.197.52.145 ;; AUTHORITY SECTION: fedoramagazine.org. 86150 IN NS ns05.fedoraproject.org. fedoramagazine.org. 86150 IN NS ns02.fedoraproject.org. fedoramagazine.org. 86150 IN NS ns04.fedoraproject.org. ;; ADDITIONAL SECTION: ns02.fedoraproject.org. 86150 IN A 152.19.134.139 ns04.fedoraproject.org. 86150 IN A 209.132.181.17 ns05.fedoraproject.org. 86150 IN A 85.236.55.10 ns02.fedoraproject.org. 86150 IN AAAA 2610:28:3090:3001:dead:beef:cafe:fed5 ns05.fedoraproject.org. 86150 IN AAAA 2001:4178:2:1269:dead:beef:cafe:fed5 ;; Query time: 1 msec ;; SERVER: 192.168.1.160#53(192.168.1.160) ;; WHEN: Mon Jan 06 08:46:05 CST 2020 ;; MSG SIZE rcvd: 266确保 SERVER 输出的是你 DNS 服务器的 IP 地址。你的 DNS 服务器设置完成了，现在所有来自客户端的请求都会经过你的 DNS 服务器了！via: https://fedoramagazine.org/how-to-setup-a-dns-server-with-bind/作者：Curt Warfield 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
TFTP 即 简单文本传输协议 Trivial File Transfer Protocol ，允许用户通过 UDP 协议在系统之间传输文件。默认情况下，协议使用的是 UDP 的 69 号端口。TFTP 协议广泛用于无盘设备的远程启动。因此，在你的本地网络建立一个 TFTP 服务器，这样你就可以对 安装好的 Fedora 和其他无盘设备做一些操作，这将非常有趣。TFTP 仅仅能够从远端系统读取数据或者向远端系统写入数据，而没有列出远端服务器上文件的能力。它也没提供用户身份验证。由于安全隐患和缺乏高级功能，TFTP 通常仅用于局域网内部（LAN）。安装 TFTP 服务器首先你要做的事就是安装 TFTP 客户端和 TFTP 服务器：dnf install tftp-server tftp -y上述的这条命令会在 /usr/lib/systemd/system 目录下为 systemd 创建 tftp.service 和 tftp.socket 文件。/usr/lib/systemd/system/tftp.service /usr/lib/systemd/system/tftp.socket接下来，将这两个文件复制到 /etc/systemd/system 目录下，并重新命名。cp /usr/lib/systemd/system/tftp.service /etc/systemd/system/tftp-server.service cp /usr/lib/systemd/system/tftp.socket /etc/systemd/system/tftp-server.socket修改文件当你把这些文件复制和重命名后，你就可以去添加一些额外的参数，下面是 tftp-server.service 刚开始的样子：[Unit] Description=Tftp Server Requires=tftp.socket Documentation=man:in.tftpd [Service] ExecStart=/usr/sbin/in.tftpd -s /var/lib/tftpboot StandardInput=socket [Install] Also=tftp.socket在 [Unit] 部分添加如下内容：Requires=tftp-server.socket修改 [ExecStart] 行：ExecStart=/usr/sbin/in.tftpd -c -p -s /var/lib/tftpboot下面是这些选项的意思：-c 选项允许创建新的文件-p 选项用于指明在正常系统提供的权限检查之上没有其他额外的权限检查-s 建议使用该选项以确保安全性以及与某些引导 ROM 的兼容性，这些引导 ROM 在其请求中不容易包含目录名。默认的上传和下载位置位于 /var/lib/tftpboot。下一步，修改 [Install] 部分的内容[Install] WantedBy=multi-user.target Also=tftp-server.socket不要忘记保存你的修改。下面是 /etc/systemd/system/tftp-server.service 文件的完整内容：[Unit] Description=Tftp Server Requires=tftp-server.socket Documentation=man:in.tftpd [Service] ExecStart=/usr/sbin/in.tftpd -c -p -s /var/lib/tftpboot StandardInput=socket [Install] WantedBy=multi-user.target Also=tftp-server.socket启动 TFTP 服务器重新启动 systemd 守护进程：systemctl daemon-reload启动服务器：systemctl enable --now tftp-server要更改 TFTP 服务器允许上传和下载的权限，请使用此命令。注意 TFTP 是一种固有的不安全协议，因此不建议你在与其他人共享的网络上这样做。chmod 777 /var/lib/tftpboot配置防火墙让 TFTP 能够使用：firewall-cmd --add-service=tftp --perm firewall-cmd --reload客户端配置安装 TFTP 客户端yum install tftp -y运行 tftp 命令连接服务器。下面是一个启用详细信息选项的例子：[client@thinclient:~ ]$ tftp 192.168.1.164 tftp> verbose Verbose mode on. tftp> get server.logs getting from 192.168.1.164:server.logs to server.logs [netascii] Received 7 bytes in 0.0 seconds [inf bits/sec] tftp> quit [client@thinclient:~ ]$记住，因为 TFTP 没有列出服务器上文件的能力，因此，在你使用 get 命令之前需要知道文件的具体名称。via: https://fedoramagazine.org/how-to-set-up-a-tftp-server-on-fedora/作者：Curt Warfield 选题：lujun9972 译者：amwps290 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
Telnet 是一种客户端-服务端协议，通过 TCP 的 23 端口连接到远程服务器。Telnet 并不加密数据，因此它被认为是不安全的，因为数据是以明文形式发送的，所以密码很容易被嗅探。但是，仍有老旧系统需要使用它。这就是用到 stunnel 的地方。stunnel 旨在为使用不安全连接协议的程序增加 SSL 加密。本文将以 telnet 为例介绍如何使用它。服务端安装使用 sudo 安装 stunnel 以及 telnet 的服务端和客户端：sudo dnf -y install stunnel telnet-server telnet添加防火墙规则，在提示时输入你的密码：firewall-cmd --add-service=telnet --perm firewall-cmd --reload接下来，生成 RSA 私钥和 SSL 证书：openssl genrsa 2048 > stunnel.key openssl req -new -key stunnel.key -x509 -days 90 -out stunnel.crt系统将一次提示你输入以下信息。当询问 Common Name 时，你必须输入正确的主机名或 IP 地址，但是你可以按回车键跳过其他所有内容。You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]: State or Province Name (full name) []: Locality Name (eg, city) [Default City]: Organization Name (eg, company) [Default Company Ltd]: Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server's hostname) []: Email Address []将 RSA 密钥和 SSL 证书合并到单个 .pem 文件中，并将其复制到 SSL 证书目录：cat stunnel.crt stunnel.key > stunnel.pem sudo cp stunnel.pem /etc/pki/tls/certs/现在可以定义服务和用于加密连接的端口了。选择尚未使用的端口。此例使用 450 端口进行隧道传输 telnet。编辑或创建 /etc/stunnel/telnet.conf：cert = /etc/pki/tls/certs/stunnel.pem sslVersion = TLSv1 chroot = /var/run/stunnel setuid = nobody setgid = nobody pid = /stunnel.pid socket = l:TCP_NODELAY=1 socket = r:TCP_NODELAY=1 [telnet] accept = 450 connect = 23accept 选项是服务器将监听传入 telnet 请求的接口。connect 选项是 telnet 服务器的内部监听接口。接下来，创建一个 systemd 单元文件的副本来覆盖原来的版本：sudo cp /usr/lib/systemd/system/stunnel.service /etc/systemd/system编辑 /etc/systemd/system/stunnel.service 来添加两行。这些行在启动时为服务创建 chroot 监狱。[Unit] Description=TLS tunnel for network daemons After=syslog.target network.target [Service] ExecStart=/usr/bin/stunnel Type=forking PrivateTmp=true ExecStartPre=-/usr/bin/mkdir /var/run/stunnel ExecStartPre=/usr/bin/chown -R nobody:nobody /var/run/stunnel [Install] WantedBy=multi-user.target接下来，配置 SELinux 以在你刚刚指定的新端口上监听 telnet：sudo semanage port -a -t telnetd_port_t -p tcp 450最后，添加新的防火墙规则：firewall-cmd --add-port=450/tcp --perm firewall-cmd --reload现在你可以启用并启动 telnet 和 stunnel。systemctl enable telnet.socket stunnel@telnet.service --now要注意 systemctl 命令是有顺序的。systemd 和 stunnel 包默认提供额外的模板单元文件。该模板允许你将 stunnel 的多个配置文件放到 /etc/stunnel 中，并使用文件名启动该服务。例如，如果你有一个 foobar.conf 文件，那么可以使用 systemctl start stunnel@foobar.service 启动该 stunnel 实例，而无需自己编写任何单元文件。如果需要，可以将此 stunnel 模板服务设置为在启动时启动：systemctl enable stunnel@telnet.service客户端安装本文的这部分假设你在客户端系统上以普通用户（拥有 sudo 权限）身份登录。安装 stunnel 和 telnet 客户端：dnf -y install stunnel telnet将 stunnel.pem 从远程服务器复制到客户端的 /etc/pki/tls/certs 目录。在此例中，远程 telnet 服务器的 IP 地址为 192.168.1.143。sudo scp myuser@192.168.1.143:/etc/pki/tls/certs/stunnel.pem /etc/pki/tls/certs/创建 /etc/stunnel/telnet.conf：cert = /etc/pki/tls/certs/stunnel.pem client=yes [telnet] accept=450 connect=192.168.1.143:450accept 选项是用于 telnet 会话的端口。connect 选项是你远程服务器的 IP 地址以及监听的端口。接下来，启用并启动 stunnel：systemctl enable stunnel@telnet.service --now测试你的连接。由于有一条已建立的连接，你会 telnet 到 localhost 而不是远程 telnet 服务器的主机名或者 IP 地址。[user@client ~]$ telnet localhost 450 Trying ::1... telnet: connect to address ::1: Connection refused Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. Kernel 5.0.9-301.fc30.x86_64 on an x86_64 (0) server login: myuser Password: XXXXXXX Last login: Sun May 5 14:28:22 from localhost [myuser@server ~]$via: https://fedoramagazine.org/securing-telnet-connections-with-stunnel/作者：Curt Warfield 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
每天似乎都有一个安全漏洞的新闻报道，说我们的数据会因此而存在风险。尽管 SSH 是一种远程连接系统的安全方式，但你仍然可以使它更安全。本文将向你展示如何做到这一点。此时 双因子验证 two-factor authentication （2FA）就有用武之地了。即使你禁用密码并只允许使用公钥和私钥进行 SSH 连接，但如果未经授权的用户偷窃了你的密钥，他仍然可以借此访问系统。使用双因子验证，你不能仅仅使用 SSH 密钥连接到服务器，你还需要提供手机上的验证器应用程序随机生成的数字。本文展示的方法是 基于时间的一次性密码 Time-based One-time Password （TOTP）算法。Google Authenticator 用作服务器应用程序。默认情况下，Google Authenticator 在 Fedora 中是可用的。至于手机，你可以使用与 TOTP 兼容的任何可以双路验证的应用程序。Andorid 或 iOS 有许多可以与 TOTP 和 Google Authenticator 配合使用的免费应用程序。本文与 FreeOTP 为例。安装并设置 Google Authenticator首先，在你的服务器上安装 Google Authenticator。 $ sudo dnf install -y google-authenticator运行应用程序：$ google-authenticator该应用程序提供了一系列问题。下面的片段展示了如何进行合理的安全设置：Do you want authentication tokens to be time-based (y/n) y Do you want me to update your "/home/user/.google_authenticator" file (y/n)? y这个应用程序为你提供一个密钥、验证码和恢复码。把它们放在安全的地方。如果你丢失了手机，恢复码是访问服务器的唯一方式。设置手机验证在你的手机上安装验证器应用程序（FreeOTP）。如果你有一台安卓手机，那么你可以在 Google Play 中找到它，也可以在苹果 iPhone 的 iTunes 商店中找到它。Google Authenticator 会在屏幕上显示一个二维码。打开手机上的 FreeOTP 应用程序，选择添加新账户，在应用程序顶部选择二维码形状工具，然后扫描二维码即可。设置完成后，在每次远程连接服务器时，你必须提供验证器应用程序生成的随机数。完成配置应用程序会向你询问更多的问题。下面示例展示了如何设置合理的安全配置。Do you want to disallow multiple uses of the same authentication token? This restricts you to one login about every 30s, but it increases your chances to notice or even prevent man-in-the-middle attacks (y/n) y By default, tokens are good for 30 seconds. In order to compensate for possible time-skew between the client and the server, we allow an extra token before and after the current time. If you experience problems with poor time synchronization, you can increase the window from its default size of +-1min (window size of 3) to about +-4min (window size of 17 acceptable tokens). Do you want to do so? (y/n) n If the computer that you are logging into isn't hardened against brute-force login attempts, you can enable rate-limiting for the authentication module. By default, this limits attackers to no more than 3 login attempts every 30s. Do you want to enable rate-limiting (y/n) y现在，你必须设置 SSH 来利用新的双路验证。配置 SSH在完成此步骤之前，确保你已使用公钥建立了一个可用的 SSH 连接，因为我们将禁用密码连接。如果出现问题或错误，一个已经建立的连接将允许你修复问题。在你的服务器上，使用 sudo 编辑 /etc/pam.d/sshd 文件。$ sudo vi /etc/pam.d/ssh注释掉 auth substack password-auth 这一行：#auth substack password-auth将以下行添加到文件底部：auth sufficient pam_google_authenticator.so保存并关闭文件。然后编辑 /etc/ssh/sshd_config 文件：$ sudo vi /etc/ssh/sshd_config找到 ChallengeResponseAuthentication 这一行并将其更改为 yes：ChallengeResponseAuthentication yes找到 PasswordAuthentication 这一行并将其更改为 no：PasswordAuthentication no将以下行添加到文件底部：AuthenticationMethods publickey,password publickey,keyboard-interactive保存并关闭文件，然后重新启动 SSH：$ sudo systemctl restart sshd测试双因子验证当你尝试连接到服务器时，系统会提示你输入验证码：[user@client ~]$ ssh user@example.com Verification code:验证码由你手机上的验证器应用程序随机生成。由于这个数字每隔几秒就会发生变化，因此你需要在它变化之前输入它。如果你不输入验证码，你将无法访问系统，你会收到一个权限被拒绝的错误：[user@client ~]$ ssh user@example.com Verification code: Verification code: Verification code: Permission denied (keyboard-interactive). [user@client ~]$结论通过添加这种简单的双路验证，现在未经授权的用户访问你的服务器将变得更加困难。via: https://fedoramagazine.org/two-factor-authentication-ssh-fedora/作者：Curt Warfield 选题：lujun9972 译者：MjSeven 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
如何快速简单地在 Fedora 、 CentOS 及类似的 Linux 发行版上重置 root 密码。系统管理员可以轻松地为忘记密码的用户重置密码。但是如果系统管理员忘记 root 密码或他从公司离职了，会发生什么情况？本指南将向你介绍如何在不到 5 分钟的时间内在 Red Hat 兼容系统（包括 Fedora 和 CentOS）上重置丢失或忘记的 root 密码。请注意，如果整个系统硬盘已用 LUKS 加密，则需要在出现提示时提供 LUKS 密码。此外，此过程适用于运行 systemd 的系统，该系统自 Fedora 15、CentOS 7.14.04 和 Red Hat Enterprise Linux 7.0 以来一直是缺省的初始系统。首先你需要中断启动的过程，因此你需要启动或者如果已经启动就重启它。第一步可能有点棘手因为 GRUB 菜单会在屏幕上快速地闪烁过去。你可能需要尝试几次，直到你能够做到这一点。当你看到这个屏幕时，按下键盘上的 e 键：如果你正确地做了这点，你应该看到一个类似于这个的屏幕：使用箭头键移动到 Linux16 这行：使用你的 del 键或你的 backspace 键，删除 rhgb quiet 并替换为以下内容：rd.break enforcing=0 设置 enforcing=0 可以避免执行完整的系统 SELinux 重标记。一旦系统重新启动，你只需要为 /etc/shadow 恢复正确的 SELinux 上下文。我会告诉你如何做到这一点。按下 Ctrl-x 启动。系统现在将处于紧急模式。以读写权限重新挂载硬盘驱动器：# mount –o remount,rw /sysroot 运行 chroot 来访问系统：# chroot /sysroot 你现在可以更改 root 密码：# passwd 出现提示时，输入新的 root 密码两次。如果成功，你应该看到一条消息显示 “all authentication tokens updated successfully”。输入 exit 两次以重新启动系统。以 root 身份登录并恢复 /etc/shadow 的 SELinux 标签。# restorecon -v /etc/shadow 将 SELinux 回到 enforce 模式：# setenforce 1 via: https://opensource.com/article/18/4/reset-lost-root-password作者：Curt Warfield 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出