分类 技术 下的文章

最近的 sudo 版本增加了新的功能,使你能够观察和控制以前隐藏的问题。

 title=

当你想授予你的一些用户管理权限,同时控制和检查他们在你的系统上做什么时,你会使用 sudo。然而,即使是 sudo',也有相当多不可控的地方,想想给予 shell 权限的情况就知道了。最近的 sudo 版本增加了一些功能,可以让你看到这些问题,甚至控制它们。例如,你可以启用更详细、更容易处理的日志信息,并记录 shell 会话中执行的每个命令。

这些功能中有些是全新的。有些是出现在 1.9.0 甚至更早的版本中的功能。例如,sudo 可以记录终端上发生的一切,即使是在 1.8 版本。然而,系统将这些记录保存在本地,它们很容易被删除,特别是那些记录最有用的地方:Shell 会话。1.9.0 版本增加了会话记录集中收集,因此记录不能被本地用户删除,最近的版本还增加了中继功能,使收集功能更加强大。

如果你只知道 sudo 的基础知识,或者以前只使用过 1.8 版本,我建议你阅读我以前的 文章

1、JSON 格式的日志记录

我想介绍的第一个新功能是 JSON 格式的日志记录。我是一个日志狂热者(12 年前我就开始在 syslog-ng 项目上工作),而这个功能是我在这里发表文章后引入的第一个功能。启用后,sudo 记录了更多的信息,并且以一种更容易解析的方式进行。

传统的 syslog 信息很短,只包含最小的必要信息量。这是由于旧的 syslog 实现的限制。超过 1k 大小的信息被丢弃或截断。

Jan 28 13:56:27 localhost.localdomain sudo[10419]: czanik : TTY=pts/0 ; PWD=/home/czanik ; USER=root ; COMMAND=/bin/bash

最近的 syslog 实现可以处理更大的信息量。syslog-ng 默认接受 64k 大小的日志信息(当然,它可以更小或更大,取决于实际配置)。

同样的事件,如果以 JSON 格式记录,就会包含更多的信息。更多并不意味着更难处理。JSON 格式的信息更容易被许多日志管理软件应用解析。下面是一个例子:

Jan 28 13:58:20 localhost.localdomain sudo[10518]: @cee:{"sudo":{"accept":{"uuid":"616bc9efcf-b239-469d-60ee-deb5af8ce6","server_time":{"seconds":1643374700,"nanoseconds":222446715,"iso8601":"20220128125820Z","localtime":"Jan 28 13:58:20"},"submit_time":{"seconds":1643374700,"nanoseconds":209935349,"iso8601":"20220128125820Z","localtime":"Jan 28 13:58:20"},"submituser":"czanik","command":"/bin/bash","runuser":"root","runcwd":"/home/czanik","ttyname":"/dev/pts/0","submithost":"localhost.localdomain","submitcwd":"/home/czanik","runuid":0,"columns":118,"lines":60,"runargv":["/bin/bash"],"runenv":["LANG=en_US.UTF-8","HOSTNAME=localhost.localdomain","SHELL=/bin/bash","TERM=xterm-256color","PATH=/home/czanik/.local/bin:/home/czanik/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin","MAIL=/var/mail/root","LOGNAME=root","USER=root","HOME=/root","SUDO_COMMAND=/bin/bash","SUDO_USER=czanik","SUDO_UID=1000","SUDO_GID=1000"]}}}

你可以在 sudoers 文件中启用 JSON 格式的日志信息:

Defaults log_format=json

你可以从我的 syslog-ng 博客中了解更多关于如何从 sudo 中使用 JSON 格式的日志信息。

2、使用 sudo\_logsrvd 集中收集日志

1.9.4 中另一个与日志相关的功能是使用 sudo_logsrvd 收集所有 sudo 日志信息(包括失败的)。以前,系统只在 sudo_logsrvd 实际进行记录时记录成功的会话。最后仍然默认通过 syslog 进行记录。

为什么这很重要?首先,你可以在一个地方收集任何与 sudo 有关的东西。无论是会话记录还是所有相应的日志信息。其次,它还可以保证正确记录所有与 sudo 有关的事件,因为如果 sudo_logsrvd 无法访问,sudo 可以拒绝执行命令。

你可以在 sudoers 文件中通过以下设置启用 sudo_logsrvd 日志记录(当然要替换 IP 地址):

Defaults log_servers=172.16.167.150

如果你想要 JSON 格式的日志信息,你需要在 sudo_logsrvd 配置的 [eventlog] 部分进行如下设置:

log_format = json

否则,sudo_logsrvd 使用传统的 sudo 日志格式,并作了简单的修改。它还包括日志来源的主机的信息:

Nov 18 12:40:16 centos8splunk.localdomain sudo[21028]:   czanik : 3 incorrect password attempts ; HOST=centos7sudo.localdomain ; TTY=pts/0 ; PWD=/home/czanik ; USER=root ; COMMAND=/bin/bash
Nov 18 12:40:23 centos8splunk.localdomain sudo[21028]:   czanik : HOST=centos7sudo.localdomain ; TTY=pts/0 ; PWD=/home/czanik ; USER=root ; TSID=00000A ; COMMAND=/bin/bash
Nov 18 12:40:30 centos8splunk.localdomain sudo[21028]:   czanik : command rejected by I/O plugin ; HOST=centos7sudo.localdomain ; TTY=pts/0 ; PWD=/home/czanik ; USER=root ; COMMAND=/bin/bash

3、中继

当最初引入 sudo_logsrvd(1.9.0 版)进行会话记录集中收集时,客户端只能直接发送记录。1.9.7 版本引入了中继的概念。有了中继,你可以不直接发送记录,而是将记录发送到多级中间主机,这些中间主机构成你的网络。

为什么这很重要?首先,中继使收集会话记录成为可能,即使集中主机由于网络问题或维护而不可用。默认情况下,sudo 在无法发送记录时拒绝运行,所以中继可以确保你可以全天候使用 sudo

其次,它还允许你对网络有更严格的控制。你不需要为所有的主机向中心的 sudo_logsrvd 开放防火墙,而只需要允许你的中继通过。

最后,它允许你从没有直接互联网接入的网络中收集会话记录,比如 AWS 私有网络,你可以在网关主机上以中继模式安装 sudo_logsrvd

当你使用中继时,sudo 客户端和中心的 sudo_logsrvd 的配置保持不变。在中继主机上,在 sudo_logsrvd.conf[relay] 部分添加以下一行:

relay_host = 172.16.167.161

如果知道通往中心服务器的网络连接有问题,你可以配置中继,在转发记录之前储存它:

store_first = true

4、记录子命令

你是否曾经想知道在通过 sudo 启动的 shell 会话中发生了什么?是的,会话记录是存在的,但是为了看几个命令的执行情况而看几个小时的记录是很无聊的,也是对时间的巨大浪费。幸运的是,1.9.8 版本引入了子命令日志。现在,只需定期检查你的日志信息,并在发生可疑情况时才观看记录。

你甚至不需要一个允许 shell 访问的规则,只需要访问一个编辑器就可以访问 shell。大多数编辑器可以运行外部命令。我最喜欢的编辑器是 JOE,这是我通过 sudo 启动它时可以看到的情况:

Aug 30 13:03:00 czplaptop sudo[10150]:   czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/joe

不用吃惊,就在一个编辑器里,我生成一个 shell 并从该 shell 中删除一些文件和分区。现在让我们看看当你启用对子命令记录时会发生什么:

Aug 30 13:13:14 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/joe
Aug 30 13:13:37 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/bin/sh -c /bin/bash
Aug 30 13:13:37 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/bin/bash
Aug 30 13:13:37 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/readlink /proc/10889/exe
[...]
Aug 30 13:13:37 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/sed -r s@/*:|([^\\\\]):@\1\n@g;H;x;s@/\n@\n@
Aug 30 13:13:37 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/tty
Aug 30 13:13:42 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/id
Aug 30 13:13:56 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/ls -A -N --color=none -T 0 /usr/share/syslog-ng/include/scl/

我省略了几十行以节省一些空间,但你仍然可以看到我启动了一个 shell,bash_profile 执行的命令也可以在日志中看到。

你可以在 sudoers 文件中使用以下设置来启用子命令日志:

`Defaults log_subcmds`

在传统的 sudo 日志中,你可以从 sudo 进程 ID 看到这些日志正是来自同一个 sudo会话。如果你打开 JSON 格式的日志,如前面所示,sudo 在日志中记录了更多的信息,使之更容易进行分析。

5、拦截子命令

记录子命令可以消除 sudo 的大部分隐患,但在有些情况下,你不只是想观察正在发生的事情,还想控制事件的流程。例如,你需要给一个用户提供 shell 权限,但仍想阻止他们运行一个特定的命令。在这种情况下,拦截是理想的选择。当然,也有一些限制,比如你不能限制 shell 的内置命令。

比方说,who 命令很危险。你可以分两步启用拦截。第一个步骤是启用它,第二个步骤是配置它。在这种情况下,我的用户不被允许运行 who

Defaults intercept
czanik ALL = (ALL) ALL, !/usr/bin/who

当我通过sudo 启动一个 root shell 会话并尝试运行 who 时,会发生以下情况:

$ sudo -s
# who
Sorry, user czanik is not allowed to execute '/usr/bin/who' as root on czplaptop.
bash: /usr/bin/who: Permission denied

你可以很容易地完全禁用运行 shell:

Defaults intercept
Cmnd_Alias SHELLS=/usr/bin/bash, /usr/bin/sh, /usr/bin/csh
czanik ALL = (ALL) ALL, !SHELLS

这意味着你不能通过 sudo 启动 shell 会话。不仅如此,你也不能从编辑器中执行外部命令。当我试图从 vi 中启动 ls 命令时,就会出现这种情况:

$ sudo vi /etc/issue
Sorry, user czanik is not allowed to execute '/bin/bash -c /bin/ls' as root on czplaptop.
Cannot execute shell /bin/bash
Press ENTER or type command to continue

接下来是什么?

我希望读了我的文章后,自己尝试一下这些新功能。你可以通过你的软件包管理器在许多 Linux 发行版和 UNIX 变种上安装最新的 sudo,或者使用 Sudo 网站 上的二进制安装程序。

这篇文章只是为你提供了一个新的可能性的概述。如果你想了解更多关于这些功能的信息,请访问网站,那里有手册页面,也有 Sudo 博客


via: https://opensource.com/article/22/2/new-sudo-features-2022

作者:Peter Czanik 选题:lujun9972 译者:wxy 校对:wxy

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

试试 LibreOffice 中的这些无障碍功能之一。你可能会发现更好的或替代的方式来完成日常工作。

 title=

LibreOffice.org 是我首选的生产力套件,我在过去已经介绍了我如何将它作为一个 图形化办公套件 以及 终端命令 使用。

在这篇文章中,我想着重介绍 LibreOffice 如何支持使用无障碍辅助技术的人。

鼠标

鼠标是一项重要的发明,但它并不是对每个人都同样有效。例如,那些不能在屏幕上看到鼠标指针的人,或者不能在他们的桌子上实际操作鼠标的人,从鼠标中获益不多。

为了考虑到人们与电脑互动方式的不同,你可以在没有鼠标的情况下使用 LibreOffice。与应用中的大多数无障碍功能一样,这个功能对任何人都有帮助。即使你自己是一个鼠标用户,有时你也不想把你的手从键盘上移开。能够在“打字模式”下触发特定的 LibreOffice 动作,对于忙碌的打字员来说真的很方便。

你可以使用 Alt 键和菜单名称中的一个触发字母来打开 LibreOffice 主菜单中的每一个项目。在默认情况下,你不会看到这些触发字母,但当你按下 Alt 键时,它们就会出现。

 title=

要打开 文件 File 菜单,按住 ALT+F。要打开 格式 Format 菜单,按住 ALT+O。当菜单被打开后,你就可以释放按键。

在你打开一个菜单后,该菜单中的每个项目都有一个触发字母,或者你可以使用键盘上的箭头键导航到该项目并按下回车

要关闭一个菜单而不做任何事情,按 Esc 键。

不用鼠标就能改变一个字体

LibreOffice 界面中的所有东西都可以从菜单中获得,即使你认为它只是工具栏中的一个元素。例如,你通常可能会将鼠标移动到格式化工具栏来改变字体,但你也可以通过选择文本,然后打开 格式 Format 菜单并选择 字符 Character 来打开字符对话框来改变字体。你可以使用 Tab箭头回车 键来浏览这个对话框。

这里需要注意的是,你可以在一个应用中使用许多不同的路径来达到同一个目标。每个场景都可能有不同的最佳路径,所以在处理任务时不要想得太线性。

常见的快捷方式

这里有一些 LibreOffice Writer 的快捷键:

  • F2:公式栏
  • Ctrl+F2:插入字段
  • F3:自动文本
  • F5: 打开/关闭导航
  • Shift+F5:将光标移到上次保存文件时的位置
  • Ctrl+Shift+F5:打开导航,进入页面
  • F7:拼写
  • F8:同义词

以下是电子表格的快捷键:

  • Ctrl+Home:返回到 A1 单元格
  • Ctrl+End:移到最后一个包含数据的单元格
  • Home:将光标移到当前行的第一个单元格
  • End:将光标移到当前行的最后一个单元格
  • Shift+Home:选择从当前单元格到当前行的第一个单元格的单元格

LibreOffice 的文档非常丰富,通过按键盘上的 Alt+HF1 可以很容易地获取。

无障碍设置

关于更多的无障碍设置,请进入 工具 Tools 菜单,选择 选项 Options 。在选项对话框中,在左边的栏目中展开 LibreOffice 类别,然后点击 无障碍 Accessibility

选项包括:

  • 在只读文本文件中使用文本选择光标:这允许你在只读文档中移动,就像你可以编辑它一样,限制了你实际可以做的选择和复制文本。
  • 允许动画图像:不是每个人都希望在工作时在他们的文档中出现移动的图像。你可以在这里进行调整。
  • 允许动画文本:与图像一样,动画文本样式对一些人来说是有趣的,而对另一些人来说则是分散注意力或令人困惑的。

也有高对比度主题的选项。如果你在你的操作系统上使用高对比度模式,LibreOffice 会自动检测并改变它的主题来匹配。

键盘快捷方式

你可以通过设置自己的键盘快捷键来定制你与 LibreOffice 的交互方式。进入 工具 Tools 菜单,选择 自定义 Customize (或者直接按 Alt+T,然后按 C)。

选择 键盘 Keyboard 标签,必要时按箭头键或用鼠标点击它(如果你还在使用鼠标)。

对所有人开放

让开源的应用无障碍化有利于所有的用户。通过尝试 LibreOffice 中的无障碍功能,你可能会发现更好的或替代性的方法来完成日常任务。无论你是否“需要”该功能,无障碍功能提供了选择。试试其中的一些,因为你可能会发现你喜欢的东西。如果你有一个 LibreOffice(或任何你喜欢的开源应用)似乎没有提供的要求,在其错误跟踪系统中提交一个功能请求来让该项目知道。


via: https://opensource.com/article/22/2/libreoffice-accessibility

作者:Don Watkins 选题:lujun9972 译者:geekpi 校对:wxy

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

下载这份编程速查表,开始学习 Perl 的力量。

 title=

Perl 发布于 1988 年初,是一种后现代的编程语言,它通常被认为是一种脚本语言,但它也能进行面向对象的编程。它是一种成熟的语言,拥有 数以万计的库、GUI 框架,它有一种叫做 Raku 的衍生语言(即 Perl 6),以及一个活跃而热情的社区。它的开发者以其灵活性为荣。根据它的创造者 Larry Wall 的说法,Perl 并不对它的用户强加任何特定的编程风格,而且有不止一种方法来完成大多数事情。

Perl 非常健壮,它曾经被广泛使用,这使它成为新的程序员可以尝试的伟大语言。

Perl 基础知识

在 Linux 和 macOS 上,你已经安装了 Perl。在 Windows 上,请从 Perl 网站 下载并安装它。

Perl 表达式

Perl 源代码的基本单位是 表达式,它是任何能返回一个 的东西。

例如,1 是一个表达式,它返回 1 的值。表达式 2 返回 2 的值,而 a 返回字母 a

表达式可以更复杂。表达式 $a + $b 包含变量(数据的占位符)和加号(+),它是一个数学运算符。

Perl 语句

Perl 语句是由表达式组成的。每个语句都以分号(;)结束。

比如说:

$c = $a + $b;

要尝试运行你自己的 Perl 语句,请打开终端并输入:

$ perl -e 'print ("Hello Perl\n");'

Perl 语句块

Perl 语句块可以用大括号({ })组合起来。块是一种有用的组织工具,但它们也为那些你可能只需要在程序的一小部分使用的数据提供了 范围。Python 用空白定义范围,LISP 用小括号,而 C 和 Java 用大括号。

变量

变量是数据的占位符。人类每天都在使用变量而没有意识到它。例如,“它”这个词可以指代任何名词,所以我们把它作为一个方便的占位符。“找到我的手机并把它拿给我”实际上是指“找到我的手机并把我的手机拿给我。”

对于计算机来说,变量不是一种便利,而是一种必需品。变量是计算机识别和跟踪数据的方式。

在 Perl 中,你通过声明一个变量名称和它的内容来创建变量。

在 Perl 中,变量名称前面总是有一个美元符号($)。

这些简单的语句创建了一个包含 "Hello""Perl" 字符串的变量 $var,然后将该变量的内容打印到终端:

$ perl -e '$var = "hello perl"; print ("$var\n");'

流程控制

大多数程序需要做出决定,这些选择由条件语句和循环来定义和控制。if 语句是最直观的一种。Perl 可以测试一个特定的条件,然后 Perl 根据这个条件决定程序如何进行。其语法类似于 C 或 Java:

my $var = 1;

if ($var == 1) {
  print("Hello Perl\n");
}
elsif ($var == 0){
  print("1 not found");
}
else {
  print("Good-bye");
}

Perl 也有一个简短的 if 语句的形式:

$var = 1;

print("Hello Perl\n") if ($var == 1);

函数和子程序

尽可能多地重复使用代码是一种有益的编程习惯。这种做法可以减少错误(或将错误合并到一个代码块中,因此你只需修复一次),使你的程序更容易维护,简化你的程序逻辑,并使其他开发者更容易理解它。

在 Perl 中,你可以创建一个 子程序,它接受输入(存储在一个特殊的数组变量 @_ 中)并可能返回一个输出。你可以使用关键字 sub 来创建一个子程序,后面跟一个你选择的子程序名称,然后是代码块:

#!/usr/bin/env perl

use strict;
use warnings;

sub sum {
  my $total = 0;

  for my $i(@_){
    $total += $i;
  }

  return($total);
}

print &sum(1,2), "\n";

当然,Perl 有许多子程序,你不必自己去创建。有些是内置于 Perl 中的,而社区库则提供了其他的。

用 Perl 编写脚本

Perl 可以被编译,也可以作为一种解释型的脚本语言使用。后者是刚入门时最简单的选择,特别是如果你已经熟悉了 Python 或 shell 脚本

这里有一个用 Perl 编写的简单的掷骰子脚本。把它读一遍,看看你是否能跟上它。

#!/usr/bin/env perl

use warnings;
use strict;
use utf8;
binmode STDOUT, ":encoding(UTF-8)";
binmode STDERR, ":encoding(UTF-8)";

my $sides = shift or
  die "\nYou must provide a number of sides for the dice.\n";

sub roller {
    my ($s) = @_;

    my $roll = int(rand($s));
    print $roll+1, "\n";
}

roller($sides);

第一行告诉你的 POSIX 终端要使用什么可执行文件来运行该脚本。

接下来的五行是模板式的包含内容和设置。use warnings 的设置告诉 Perl 检查错误,并在终端对它发现的问题发出警告。use strict 设置告诉 Perl 在发现错误时不要运行脚本。

这两个设置都可以帮助你在代码中的错误导致问题之前发现它们,所以通常最好在你的脚本中激活它们。

脚本的主要部分开始于对脚本从终端启动时提供给它的 参数 进行分析。在这种情况下,预期的参数是一个虚拟骰子的所需的面的数量。Perl 将其视为一个堆栈,并使用 shift 函数将其分配给变量 $sides。当没有提供参数时,die 函数会被触发。

sub 关键字创建的 roller 子程序(或函数),使用 Perl 的 rand 函数生成一个伪随机数,最大不超过参数的数字。这意味着在这个程序中,一个 6 面的骰子不可能掷出 6,但它可以掷出 0。这对计算机和程序员来说是没有问题的,但对大多数用户来说,这是令人困惑的,所以它可以被视为一个 bug。为了在这个 bug 成为问题之前解决它,下一行在随机数上加 1,并将结果作为掷骰子的结果打印出来。

当引用传递给子程序的参数时,你引用的是特殊变量 @_,它是一个数组,包含了函数调用时括号内的所有内容。然而,当从数组中提取一个值时,数据被转换成一个标量(例子中的 $s 变量)。

子程序在被调用之前不会运行,所以脚本的最后一行调用了自定义的 roller 函数,将命令的参数作为函数的参数。

将该文件保存为 dice.pl,并标记为可执行:

$ chmod +x dice.pl

最后,尝试运行它,为它提供一个最大的数字,从中选择其随机数:

$ ./dice.pl 20
1
$ ./dice.lisp 20
7
$ ./dice.lisp 20
20

没问题!

Perl 速查表

Perl 是一种有趣而强大的语言。尽管自从 Perl 成为默认的脚本语言后,Python、Ruby 和 Go 等新兴语言引起了许多人的注意,但 Perl 的功能并不弱。事实上,它比以往任何时候都要好,而且前途光明。

下次你想找一种更灵活的语言,并有简单的交付方式时,不妨试试 Perl,并下载这个速查表


via: https://opensource.com/article/22/2/perl-cheat-sheet

作者:Seth Kenlon 选题:lujun9972 译者:wxy 校对:wxy

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

以下是我如何优化我的 SSH 体验并保护我的服务器不被非法访问。

 title=

SSH(安全 Shell)是一个协议,它使你能够创建一个经过验证的私人连接,并使用加密密钥保护通道,在另一台机器上启动一个远程 Shell。使用这种连接,你可以执行远程命令,启动安全文件传输,转发套接字、显示和服务,等等。

在 SSH 出现之前,大多数远程管理是通过 telnet 完成的,公平地说,一旦你能建立一个远程会话,你几乎可以做任何你需要的事情。这个协议的问题是,通讯是以纯明文的方式进行的,没有经过加密。使用 流量嗅探器 不需要太多努力就可以看到一个会话中的所有数据包,包括那些包含用户名和密码的数据包。

有了 SSH,由于使用了非对称密钥,参与通信的设备之间的会话是加密的。如今,这比以往任何时候都更有意义,因为所有的云服务器都是由分布在世界各地的人管理的。

3 个配置 SSH 的技巧

SSH 协议最常见的实现是 OpenSSH,它由 OpenBSD 项目开发,可用于大多数 Linux 和类 Unix 操作系统。一旦你安装了这个软件包,你就会有一个名为 sshd_config 的文件来控制该服务的大部分行为。其默认设置通常是非常保守的,但我倾向于做一些调整,以优化我的 SSH 体验,并保护我的服务器不被非法访问。

1、改变默认端口

这是一个并非所有管理员都记得的问题。任何有端口扫描器的人都可以发现一个 SSH 端口,即使你之后把它移到别的端口,所以你很难把自己从危险中移除,但这样却会有效的避免了数百个针对你的服务器扫描的不成熟脚本。这是一个可以让你省心,从你的日志中减去大量的噪音的操作。

在写这篇文章时,我在一个云服务提供商上设置了一个 SSH 服务器,默认端口 TCP 22,每分钟平均被攻击次数为 24 次。在将端口改为一个更高的数字,即 TCP 45678 后,平均每天有两个连接并用各种用户名或密码进行猜测。

要改变 SSH 的默认端口,在你喜欢的文本编辑器中打开 /etc/ssh/sshd_config,将 Port 的值从 22 改为大于 1024 的某个数字。这一行可能被注释了,因为 22 是默认的(所以不需要在配置中明确声明),所以在保存之前取消注释。

Port 22122
#AddressFamily any 
#ListenAddress 0.0.0.0 
#ListenAddress ::

一旦你改变了端口并保存了文件,重新启动 SSH 服务器:

$ sudo systemctl restart sshd

2、不要使用密码

现在有一个普遍的潮流是停止使用密码作为认证手段,双因素认证等方法越来越受欢迎。OpenSSH 可以使用非对称密钥进行认证,因此不需要记住复杂的密码,更不需要每隔几个月轮换一次密码,也不需要担心有人在你建立远程会话时进行“肩后偷窥”。使用 SSH 密钥可以让你快速、安全地登录到你的远程设备上。这往往意味着花费在错误的用户名和密码上的时间更少。登录令人愉快的简单。当没有密钥时,就没有入口,甚至没有提示符。

要使用这个功能,你必须同时配置客户机(在你面前的计算机)和服务器(远程机器)。

在客户端机器上,你必须生成一个 SSH 密钥对。这包括一个公钥和一个私钥。正如它们的名字所暗示的,一个公开的密钥是供你分发给你想登录的服务器的,另一个是私人的密钥,必须不与任何人分享。使用 ssh-keygen 命令可以创建一个新的密钥对,并使用 -t 选项来指定一个好的、最新的密码学库,如 ed25519

$ ssh-keygen -t ed25519    
 Generating public/private ed25519 key pair. 
 Enter file in which to save the key (~/.ssh/id_ed25519):

在密钥创建过程中,你会被提示为文件命名。你可以按回车键来接受默认值。如果你将来创建了更多的密钥,你可以给每个密钥起一个自定义的名字,但有多个密钥意味着你要为每次交互指定使用哪个密钥,所以现在只要接受默认即可。

你还可以给你的密钥一个口令。这可以确保即使别人设法获得你的私钥(这本身就不应该发生),没有你的口令,他们也无法将其投入使用。这对某些密钥来说是一种有用的保护措施,而对其他密钥来说则不合适(特别是那些用于脚本的密钥)。按回车键让你的密钥没有口令,或者你选择创建一个口令。

要把你的密钥复制到服务器上,使用 ssh-copy-id 命令。例如,如果我拥有一台名为 example.com 的服务器,那么我可以用这个命令把我的公钥复制到它上面:

$ ssh-copy-id [email protected]

这将在服务器的 .ssh 目录下创建或修改 authorized_keys 文件,其中包含你的公钥。

一旦确认 ssh-copy-id 命令完成了它所做的事情,尝试从你的电脑上登录,以验证你可以在没有密码的情况下登录(或者如果你选择使用你的密钥的口令,就输入密钥口令)。

在没有使用你的服务器帐户的密码登录到你的服务器上后,编辑服务器的 sshd_config 并将 PasswordAuthentication 设置为 no

PasswordAuthentication no

重新启动 SSH 服务以加载新的配置:

$ sudo systemctl restart sshd

3、决定谁可以登录

大多数发行版不允许 root 用户通过 SSH 登录,这确保只有非特权账户是活跃的,根据需要使用 sudo 命令来提升权限。这就防止了一个明显的、令人痛苦的目标(root)受到简单而常见的脚本攻击。

同样,OpenSSH 的一个简单而强大的功能是能够决定哪些用户可以登录到一台机器。要设置哪些用户被授予 SSH 访问权,在你最喜欢的文本编辑器中打开 sshd_config 文件,并添加这样一行:

AllowUsers jgarrido jane tux

重新启动 SSH 服务以加载新的配置选项。

这只允许三个用户(jgarridojanetux)登录或在远程机器上执行任何操作。

总结

你可以使用 OpenSSH 来实现一个强大而稳健的 SSH 服务器。这些只是加固你的系统的三个有用的选项。尽管如此,在 sshd_config 文件中仍有大量的功能和选项可以打开或关闭,而且有许多很棒的应用程序,如 Fail2ban,你可以用来进一步保护你的 SSH 服务。


via: https://opensource.com/article/22/2/configure-ssh-privacy

作者:Jonathan Garrido 选题:lujun9972 译者:wxy 校对:wxy

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

当涉及到 SSL/TLS 证书时,你可能会遇到各种问题,有些与浏览器有关,有些则是网站后台的问题。

其中一个错误是 Linux 中的 “Unacceptable TLS certificate”。

不幸的是,对此没有“一劳永逸”的答案。然而,有一些潜在的解决方案,你可以尝试,在此,我打算为你强调这些。

你什么时候会遇到这个 TLS 证书问题?

在我的例子中,我是在通过终端添加 Flathub 仓库时注意到这个问题的,这个步骤可以让你在 设置 Flatpak 时访问大量的 Flatpak 集合。

然而,在安装 Flatpak 应用或通过终端使用来自第三方仓库的 Flatpak 参考文件时,你也可能会遇到这个错误。

一些用户在 Linux 上使用他们组织推荐的 VPN 服务工作时注意到这个问题。

那么,如何解决这个问题呢?为什么这是一个问题?

嗯,从技术上讲,这是两件事中的一个:

  • 你的系统不接受该证书(并说它是无效的)。
  • 该证书与用户连接的域不匹配。

如果是第二种情况,你得联系网站的管理员,从他们那里解决这个问题。

但是,如果是第一种情况,你有几种方法来处理它。

1、在使用 Flatpak 或添加 GNOME 在线账户时修复 “Unacceptable TLS certificate”

如果你试图添加 Flathub 远程或一个新的 Flatpak 应用,并在终端中注意到这个错误,你可以简单地输入:

sudo apt install --reinstall ca-certificates

这应该会重新安装受信任的 CA 证书,以防止列表中出现某种问题。

在我的例子中,当试图添加 Flathub 仓库时,我遇到了错误,通过在终端输入上述命令解决了这个问题。

所以,我认为任何与 Flatpak 有关的 TLS 证书问题都可以用这个方法解决。

2、在使用工作 VPN 时修复 “Unacceptable TLS certificate”

如果你使用你的组织的 VPN 来访问与工作有关的材料,你可能要把证书添加到你的 Linux 发行版中的可信 CA 列表中。

请注意,你需要 VPN 服务或你组织的管理员分享根证书的 .CRT 版本,才能开始使用。

接下来,你需要进入 /usr/local/share/ca-certificates 目录。

你可以下面创建一个目录,并使用任何名称来标识你组织的证书。然后,将 .CRT 文件添加到该目录。

例如,它是 /usr/local/share/ca-certificates/organization/xyz.crt

请注意,你需要有 root 权限来添加证书或在 ca-certificates 目录下创建目录。

当你添加了必要的证书,你所要做的就是输入以下命令更新证书支持列表:

sudo update-ca-certificates

而且,每当你试图连接到你公司的 VPN 时,你的系统应将该证书视为有效。

总结

不可接受的 TLS 证书并不是一个常见的错误,但你可以在各种使用情况下发现它,比如连接到 GNOME 在线账户。

如果上述两种方法都不能解决这个错误,那么你所连接的域/服务有可能存在配置错误。在这种情况下,你将不得不联系他们来解决这个问题。

你是否遇到过这个错误?你是如何解决的?你是否知道这个问题的其他解决方案(有可能是容易操作的)?请在下面的评论中告诉我你的想法。


via: https://itsfoss.com/unacceptable-tls-certificate-error-linux/

作者:Ankush Das 选题:lujun9972 译者:geekpi 校对:wxy

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

当你把环境保持在源码控制中,开发虚拟机和容器就成了一个解决方案,而不是一个问题。

 title=

你是否曾经开始使用一台新的电脑,不管是出于自愿还是因为旧的电脑让你的魔法烟消云散,并且对花了多长时间才把所有东西都 弄好 而感到沮丧?更糟糕的是,有没有花了一些时间重新配置你的 shell 提示符,然后意识到你更喜欢以前的样子?

对我来说,当我决定要在 容器 中进行开发时,这个问题就变得很严重了。容器是非持久的。开发工具很容易解决:一个带有工具的容器镜像就可以工作。源码很容易解决:源码控制维护它,开发是在分支上。但是,如果每次我创建一个容器,我都需要仔细地配置它,这就太痛苦了。

主目录的版本控制

将配置文件保存在版本控制中一直是一个有吸引力的选择。但是天真地这么做是令人担忧的。不可能直接对 ~ 进行版本控制。

首先,太多的程序认为把秘密放在那里是安全的。此外,它也是 ~/Downloads~/Pictures 等文件夹的位置,这些文件夹可能不应该被版本化。

小心翼翼地在主目录下保留一个 .gitignore 文件来管理 includeexclude 列表是有风险的。在某些时候,其中一个路径会出错,花费了几个小时的配置会丢失,大文件会出现在 Git 历史记录中,或者最糟糕的是,秘密和密码会被泄露。当这一策略失败时,它就成了灾难性的失败。

手动维护大量的符号链接也是行不通的。版本控制的全部原因是为了避免手动维护配置。

写一个安装脚本

这暗示了在源码控制中维护点文件的第一条线索:写一个安装脚本。

就像所有好的安装脚本一样,让它 幂等:运行两次不会两次增加配置。

像所有好的安装脚本一样,让它 只做最少的事情:使用其他的技巧来指向你的源码控制中的配置文件。

~/.config 目录

现代 Linux 程序在直接在主目录中寻找配置之前,会先在 ~/.config 中寻找。最重要的例子是 git,它在 ~/.config/git 中寻找。

这意味着安装脚本可以将 ~/.config 符号链接到主目录中源码控制的管理目录中的一个目录:

#!/bin/bash
set -e
DOTFILES="$(dirname $(realpath $0))"
[ -L ~/.config ] || ln -s $DOTFILES/config ~/.config

此脚本寻找它的位置,然后将 ~/.config 链接到它被签出的地方。这意味着几乎没有关于它需要位于主目录中的位置的假设。

获取文件

大多数 shells 仍然直接在主目录下寻找文件。为了解决这个问题,你要增加一层指示。从 $DOTFILES 中获取文件意味着在修改 shell 配置时不需要重新运行安装程序。

$!/bin/bash
set -e
DOTFILES="$(dirname $(realpath $0))"
grep -q 'SETTING UP BASH' ~/.bashrc || \
  echo "source $DOTFILES/starship.bash # SETTING UP BASH" >> ~/.bashrc

再次注意,这个脚本很仔细地做了幂等:如果这一行已经在那里了,它就不会再添加。它还考虑到了你在 .bashrc 上已经做的任何编辑,虽然这不是一个好主意,但也没有必要惩罚它。

反复测试

当你把环境保持在源码控制中时,开发虚拟机和容器就成了一个解决方案,而不是一个问题。试着做一个实验。建立一个新的开发环境,克隆你的点文件,安装,并看看有什么问题。

不要只做一次。至少每周做一次。这将使你更快地完成工作,同时也会告诉你什么是不可行的。暴露问题,修复它们,然后重复。


via: https://opensource.com/article/22/2/dotfiles-source-control

作者:Moshe Zadka 选题:lujun9972 译者:geekpi 校对:wxy

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