sshd:为当前会话添加AllowUsers,无需编辑sshd_config

sshd:为当前会话添加AllowUsers,无需编辑sshd_config

我想从 ip 1.2.3.4 临时授予 root 访问权限,仅适用于当前会话(直到下一次 sshd 或服务器重新启动)

我可以将其添加到sshd_config,然后记得将其删除:

AllowUsers [email protected]

但还有更好的办法吗?我可以在不编辑配置文件的情况下更改当前运行的 sshd 守护进程的当前设置吗?

答案1

然后记得将其删除

立即删除它,这样就没有什么可记住的,也没有什么可忘记的。我是说:

  1. 编辑sshd_config,保存更改。
  2. 重新启动守护进程。
  3. 立即地返回编辑sshd_config,保存更改。
  4. 不要重新启动守护进程。

这样,当前正在运行的(即新启动的)守护进程将使用您的临时配置,因为它是它已读取的配置;但未来的守护进程将使用常规配置,因为配置文件已被编辑回来。临时配置不再存在,除了在当前运行的守护进程的内存中,因此直到下一次sshd或服务器重新启动为止,正如您所希望的那样。

如果您可以从另一个控制台执行 (2),则可以在文本编辑器的单个实例中方便地完成 (1) 和 (3),而无需退出编辑器。如果您的文本编辑器提供“撤消”功能,则可以使用它来取消回编辑时出错的风险。

笔记:

  • sshd当 OpenSSH 收到挂断信号 SIGHUP 时,它会通过使用启动时的名称和选项执行自身来重新读取其配置文件。无论sshdOpenSSH 是否作为 systemd 服务启动,此方法都应该有效。

  • 重新启动(甚至停止)sshd 不影响现有连接

答案2

在 FreeBSD 中,rc系统提供了一种向sshd守护进程传递标志的机制,即sshd_flags在启动/重新启动之前设置变量sshd。系统rc将查找文件名 /etc/rc.conf.d/sshd/* 并在任何“service sshd”调用中获取所有此类文件。这使得在正确的目录中创建一次性唯一文件名、重新启动服务、删除该唯一文件名变得相当简单,然后我们就完成了。

据我所知,Linux 缺乏一个专用目录,可以在其中放置任意数量的任意命名的文件,以便配置特定守护程序的运行时行为。我尝试通过修改 /etc/default/ssh 来模仿 (Ubuntu) Linux 中的 FreeBSD 机制,以从特定位置 ( ) 搜索源文件,/etc/default/ssh.tmp.*但没有成功。一般来说,在我手头可用的 Linux 系统上,名义上似乎/etc/default/ssh有:

# Default settings for openssh-server. This file is sourced by /bin/sh from
# /etc/init.d/ssh.

# Options to pass to sshd
SSHD_OPTS=

在某些系统上,这里的关键变量名称似乎是OPTIONS,因此请检查您的systemd服务文件以sshd确保确定。

鉴于 A 计划不起作用,我降低了期望并采用了 B 计划,这与修改您的sshd_config计划本质上相同,只是由于默认情况下/etc/default/ssh没有内容,因此在其中附加所需的运行时选项可能比在其中附加所需的运行时选项更安全一些它会破坏你的/etc/ssh/sshd_config文件吗?此外,由于 的语法是 shell 语法,因此通过附加SSHD_OPTS 的任何先前分配的更改值,下次调用将被覆盖,然后一旦重命名回就会恢复,/etc/default/ssh因此感觉相对安全。SSHD_OPTS/etc/default/ssh.safety/etc/default/ssh

# cat << EOF > test.sh
cp -p /etc/default/ssh /etc/default/ssh.safety
printf 'SSHD_OPTS='\''-o "AllowUsers [email protected]"'\''\n' >> /etc/default/ssh
service sshd restart
mv /etc/default/ssh.safety /etc/default/ssh
EOF

所以从:

# service ssh status
● ssh.service - OpenBSD Secure Shell server
   Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2022-12-08 16:36:00 PST; 51s ago
  Process: 43364 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
 Main PID: 43367 (sshd)
    Tasks: 1 (limit: 9830)
   CGroup: /system.slice/ssh.service
           └─43367 /usr/sbin/sshd -D

...snip...

和:

# cat /etc/default/ssh 
# Default settings for openssh-server. This file is sourced by /bin/sh from
# /etc/init.d/ssh.

# Options to pass to sshd
SSHD_OPTS=

然后用:

# cat test.sh
cp -p /etc/default/ssh /etc/default/ssh.safety
printf 'SSHD_OPTS='\''-o "AllowUsers [email protected]"'\''\n' >> /etc/default/ssh
service ssh restart
mv /etc/default/ssh.safety /etc/default/ssh

我们可以:

# sh test.sh
# service ssh status
● ssh.service - OpenBSD Secure Shell server
   Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2022-12-08 16:37:42 PST; 3min 2s ago
  Process: 54918 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
 Main PID: 54923 (sshd)
    Tasks: 1 (limit: 9830)
   CGroup: /system.slice/ssh.service
           └─54923 /usr/sbin/sshd -D -o AllowUsers [email protected]

...snip...

请注意,这里sshd正在使用我们所需的短期命令行选项运行!

另请注意,它又/etc/default/ssh回到了未改变的状态:

# cat /etc/default/ssh 
# Default settings for openssh-server. This file is sourced by /bin/sh from
# /etc/init.d/ssh.

# Options to pass to sshd
SSHD_OPTS=

这意味着下次我们:

# service ssh restart

我们会看到:

# service ssh status
● ssh.service - OpenBSD Secure Shell server
   Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2022-12-08 16:43:56 PST; 7s ago
  Process: 44890 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
 Main PID: 44896 (sshd)
    Tasks: 1 (limit: 9830)
   CGroup: /system.slice/ssh.service
           └─44896 /usr/sbin/sshd -D

回到裸露的库存sshd服务。

同样,这与修改本质上是相同的技巧/etc/ssh/sshd_config,只是如果sshd_config被搞乱或删除(甚至重命名),那么从中恢复可能比从类似的文件中恢复要困难/etc/default/ssh。由于/etc/default/ssh默认情况下为空,因此您可以rm在最坏的情况下简单地sshd恢复到开始尝试玩巧妙技巧之前的运行方式。

答案3

编写您自己的单元文件,mysshd.service指向具有sshd_config所有所需更改的不同文件,然后启动它。包含 aConflicts=sshd.service以便停止正确的 sshd 服务。两个服务一次只能运行其中之一。当正确的 sshd 服务重新启动时,mysshd 将停止。

您还可以-o向 中添加选项ExecStart=并使用原始 sshd_config文件,如下所示。他们将被首先考虑。 (此示例是从 的输出中提取的systemctl cat sshd。这在其他发行版上可能有所不同)。

cat >/etc/systemd/system/mysshd.service <<\!
[Unit]
Description=my let root in OpenSSH server daemon
Conflicts=sshd.service
[Service]
Type=notify
EnvironmentFile=-/etc/crypto-policies/back-ends/opensshserver.config
EnvironmentFile=-/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS $CRYPTO_POLICY -o 'AllowUsers [email protected]'
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
!
systemctl daemon-reload
systemctl start mysshd

房间里的大象是添加AllowUsers x@y仅允许该用户而不允许其他用户。

相关内容