我注意到,在 GCP 上的 RHEL 7 服务器上,仅当我使用 systemctl 终止 multi-user.target 服务时,我启用的服务(例如 test.service)才会启动。multi-user.target 会挂起的原因是什么?
我想在 Docker-Compose 容器上配置 cgroups V2 资源限制。我该怎么做?
我有这个可以工作的脚本:
#! /usr/bin/bash
export SEQVAL=$(date +%s) && sed -i "s/^SEQ1=.*$/SEQ1=${SEQVAL}/" /etc/environment
systemctl restart ccs-srvapp-telemetry.service
就我而言,我无法使上述内容在单元文件中正常工作。
我拥有的最新版本如下,但曾尝试过几次,各种设置都因变量未设置或 sed 命令中某些内容未正确转义而失败。
[Unit]
Description=restarts fluent bit with a new SEQ1 to force a logrotate
After=network.target
[Service]
Type=oneshot
EnvironmentFile=/etc/environment
ExecStart=/usr/bin/sh -c 'export SEQVAL=$(date +%s) && sed -i "s/^SEQ1=.*$/SEQ1=${SEQVAL}/" /etc/environment'
ExecStartPost=/bin/systemctl restart ccs-srvapp-telemety.service
[Install]
WantedBy=multi-user.target
我想通过遵循xzbot漏洞演示并设置环境来了解 XZ Utils 后门。我知道xz-utils 5.6.1版本应该有后门,但我无法安装这个被感染的软件包。
从干净的 Kali Linux 2024.4 环境开始,它具有 liblzma 5.6.3,并且sshd
似乎不依赖于 libsystemd 和 liblzma。显然,无论是原装还是便携式 OpenSSH 都没有提供 systemd 支持。我对所有指南都期望sshd
已经链接到 liblzma 感到困惑,但它不适合我。
└─$ dpkg -l | grep liblzma5
ii liblzma5:amd64 5.6.3-1+b1 amd64 XZ-format compression library
└─$ ldconfig -p | grep liblzma
liblzma.so.5 (libc6,x86-64) => /lib/x86_64-linux-gnu/liblzma.so.5
└─$ sshd -V
OpenSSH_9.9p1 Debian-3, OpenSSL 3.3.2 3 Sep 2024
└─$ ldd $(which sshd)
linux-vdso.so.1 (0x00007fc3de0b8000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007fc3ddfde000)
libcrypto.so.3 => /lib/x86_64-linux-gnu/libcrypto.so.3 (0x00007fc3dda00000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc3dd80a000)
libpcre2-8.so.0 => /lib/x86_64-linux-gnu/libpcre2-8.so.0 (0x00007fc3dd768000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc3de0ba000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fc3ddfbe000)
libzstd.so.1 => /lib/x86_64-linux-gnu/libzstd.so.1 (0x00007fc3dd6a7000)
当降级到 liblzma 5.6.1 包并ldd
再次检查时,似乎没有任何变化。
└─$ wget https://snapshot.debian.org/archive/debian/20240328T025657Z/pool/main/x/xz-utils/liblzma5_5.6.1-1_amd64.deb
2024-12-24 00:45:29 (4.72 MB/s) - ‘liblzma5_5.6.1-1_amd64.deb’ saved [252188/252188]
└─$ sudo dpkg -i ./liblzma5_5.6.1-1_amd64.deb
dpkg: warning: downgrading liblzma5:amd64 from 5.6.3-1+b1 to 5.6.1-1
(Reading database ... 425071 files and directories currently installed.)
Preparing to unpack ./liblzma5_5.6.1-1_amd64.deb ...
Unpacking liblzma5:amd64 (5.6.1-1) over (5.6.3-1+b1) ...
Setting up liblzma5:amd64 (5.6.1-1) ...
Processing triggers for libc-bin (2.40-3) ...
└─$ dpkg -l | grep liblzma5
ii liblzma5:amd64 5.6.1-1 amd64 XZ-format compression library
└─$ sudo systemctl restart ssh
└─$ ldd $(which sshd)
linux-vdso.so.1 (0x00007f705e59b000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f705e4c1000)
libcrypto.so.3 => /lib/x86_64-linux-gnu/libcrypto.so.3 (0x00007f705de00000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f705dc0a000)
libpcre2-8.so.0 => /lib/x86_64-linux-gnu/libpcre2-8.so.0 (0x00007f705e41f000)
/lib64/ld-linux-x86-64.so.2 (0x00007f705e59d000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f705e3ff000)
libzstd.so.1 => /lib/x86_64-linux-gnu/libzstd.so.1 (0x00007f705db49000)
然后我尝试构建 OpenSSH 9.7p1,因为那是在后门公开之前,如果这也许有帮助的话。这需要重新启动才能sshd -V
显示 9.7p1
wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.7p1.tar.gz
tar -xvf openssh-9.7p1.tar.gz
cd openssh-9.7p1
sudo apt install libssl-dev
./configure
make
sudo make install
但是 libsystemd 和 liblzma 仍然没有链接到 sshd。
到目前为止,我甚至不知道如何安装或构建易受攻击的 xz-utils 包。当我在 Ubuntu 24.04 上尝试同样的步骤时,也遇到了类似的问题
环境
这是 vps Ubuntu 服务器 22.04.5。Wireguard 使用 tuntap 而不是内核模块。
脚本
/etc/wireguard/gw0.sh
如果从命令行运行,可以正确启动 wireguard:
# cleanup
echo "$(date) - cleanup"
/usr/sbin/ip link del gw0 2>&1
/usr/sbin/iptables -t nat -D POSTROUTING -s 10.0.0.0/24 -o venet0 -j MASQUERADE 2>&1
# setup
echo "$(date) - setup"
#/usr/sbin/ip tuntap add dev gw0 mode tun
/usr/bin/wireguard gw0 2>&1
/usr/sbin/ip a add 10.0.0.1/24 dev gw0
/usr/bin/wg set gw0 listen-port 12345
/usr/bin/wg set gw0 private-key /etc/wireguard/gw0.key
# wg0
/usr/bin/wg set gw0 peer <wg0 key> allowed-ips 10.0.0.2/32
# wg1
/usr/bin/wg set gw0 peer <wg1 key> allowed-ips 10.0.0.3/32
# start
echo "$(date) - start"
/usr/sbin/ip link set gw0 up 2>&1
/usr/sbin/iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o venet0 -j MASQUERADE 2>&1
# end
echo "$(date) - end"
exit 0
输出:
# /etc/wireguard/gw0.sh
Thu Dec 5 10:03:32 EST 2024 - cleanup
Cannot find device "gw0"
Thu Dec 5 10:03:32 EST 2024 - setup
┌──────────────────────────────────────────────────────┐
│ │
│ Running wireguard-go is not required because this │
│ kernel has first class support for WireGuard. For │
│ information on installing the kernel module, │
│ please visit: │
│ https://www.wireguard.com/install/ │
│ │
└──────────────────────────────────────────────────────┘
Thu Dec 5 10:03:32 EST 2024 - start
Thu Dec 5 10:03:33 EST 2024 - end
系统服务
/etc/systemd/system/gw0.service
:
[Unit]
Description = Start Wireguard gw0
After = network-online.target
Wants = network-online.target
[Service]
Type = oneshot
ExecStart = /usr/bin/bash -c "/etc/wireguard/gw0.sh >> /tmp/gw0.log"
[Install]
WantedBy=multi-user.target
启动服务总是会出现超时错误,并且没有wireguard进程:
# systemctl start gw0.service
Job for gw0.service failed because a timeout was exceeded.
See "systemctl status gw0.service" and "journalctl -xeu gw0.service" for details.
# systemctl status gw0.service
× gw0.service - Start Wireguard gw0
Loaded: loaded (/etc/systemd/system/gw0.service; disabled; vendor preset: enabled)
Active: failed (Result: timeout) since Thu 2024-12-05 10:12:07 EST; 34s ago
Process: 95515 ExecStart=/usr/bin/bash -c /etc/wireguard/gw0.sh >> /tmp/gw0.log (code=exited, status=0/SUCCESS)
Main PID: 95515 (code=exited, status=0/SUCCESS)
Dec 05 10:10:37 mybox systemd[1]: Starting Start Wireguard gw0...
Dec 05 10:12:07 mybox systemd[1]: gw0.service: State 'stop-sigterm' timed out. Killing.
Dec 05 10:12:07 mybox systemd[1]: gw0.service: Failed with result 'timeout'.
Dec 05 10:12:07 mybox systemd[1]: Failed to start Start Wireguard gw0.
# journalctl -xeu gw0.service
Dec 05 10:10:37 mybox systemd[1]: Starting Start Wireguard gw0...
░░ Subject: A start job for unit gw0.service has begun execution
░░ Defined-By: systemd
░░ Support: http://www.ubuntu.com/support
░░
░░ A start job for unit gw0.service has begun execution.
░░
░░ The job identifier is 2611.
Dec 05 10:12:07 mybox systemd[1]: gw0.service: State 'stop-sigterm' timed out. Killing.
Dec 05 10:12:07 mybox systemd[1]: gw0.service: Failed with result 'timeout'.
░░ Subject: Unit failed
░░ Defined-By: systemd
░░ Support: http://www.ubuntu.com/support
░░
░░ The unit gw0.service has entered the 'failed' state with result 'timeout'.
Dec 05 10:12:07 mybox systemd[1]: Failed to start Start Wireguard gw0.
░░ Subject: A start job for unit gw0.service has failed
░░ Defined-By: systemd
░░ Support: http://www.ubuntu.com/support
░░
░░ A start job for unit gw0.service has finished with a failure.
░░
░░ The job identifier is 2611 and the job result is failed.
但是,/tmp/gw0.log
显示脚本已完成:
Thu Dec 5 10:10:37 EST 2024 - cleanup
Thu Dec 5 10:10:37 EST 2024 - setup
┌──────────────────────────────────────────────────────┐
│ │
│ Running wireguard-go is not required because this │
│ kernel has first class support for WireGuard. For │
│ information on installing the kernel module, │
│ please visit: │
│ https://www.wireguard.com/install/ │
│ │
└──────────────────────────────────────────────────────┘
Thu Dec 5 10:10:37 EST 2024 - start
Thu Dec 5 10:10:37 EST 2024 - end
问题
有人知道该如何gw0.service
工作吗?
systemd 单元文件不允许手动运行,因此必须有某种东西触发它。反向依赖项可以调用它,但它们又是如何启动的?通常它们之前不会启动startx
(或者至少不应该启动),因此必须有一个触发点。
我主要感兴趣的是它如何与 startx 协同工作,而不是与登录管理器协同工作。
关于具体工作原理的详细信息gnome-session.target
也很好,因为它是利用 的会话框架实现的最实际示例graphical-session.target
。gnome-session 二进制文件确实有一个--systemd
选项。也许它是起点触发器所在的位置。但如果知道二进制文件可以简单地绕过,那就太可悲了RefuseManualStart=yes
。那将非常……触发。
systemd 单元文件中的选项RequiresMountsFor=
要求在单元启动之前挂载指定的路径。
据我所知,参数可以是挂载点以及该挂载点下的任何目录。例如,如果 BIND 的区域文件位于/etc/bind
其/etc
自己的文件系统中,则RequiresMountsFor=/etc
或都将实现所需的结果:BIND 只有在挂载并可用RequiresMountsFor=/etc/bind
时才会启动。/etc
/etc/bind
现在我想知道如果RequiresMountsFor=
指定一个不存在的路径会发生什么。例如,如果fstab
中有/
和的条目,/etc
但 下方没有任何内容/etc
, 和RequiresMountsFor=/etc/this/path/does/not/exist
引用 中不存在的路径/etc
。
这是否会导致设备等待/etc
挂载(因为它是路径中的最后一个挂载点)?如果是这样,设备最终会在/etc
挂载后启动吗?还是会因为/etc/this/path/does/not/exist
找不到而失败?
这可能与单元接受参数有关,例如[email protected]
,它具有RequiresMountsFor=/etc/postgresql/%I /var/lib/postgresql/%I
。如果一个集群的数据文件被移走,则在该集群上调用该单元时,第二条路径将指向任何地方。
lsns
根据运行它的用户的权限,输出看起来会有所不同。ubuntu
用户和root
用户得到不同的结果:
ubuntu@ubuntu:~$ lsns
NS TYPE NPROCS PID USER COMMAND
4026531834 time 6 134628 ubuntu /lib/systemd/systemd --user
4026531835 cgroup 6 134628 ubuntu /lib/systemd/systemd --user
4026531836 pid 6 134628 ubuntu /lib/systemd/systemd --user
4026531837 user 5 134628 ubuntu /lib/systemd/systemd --user
4026531838 uts 6 134628 ubuntu /lib/systemd/systemd --user
4026531839 ipc 6 134628 ubuntu /lib/systemd/systemd --user
4026531840 net 6 134628 ubuntu /lib/systemd/systemd --user
4026531841 mnt 5 134628 ubuntu /lib/systemd/systemd --user
4026532290 user 1 134689 ubuntu /usr/bin/podman
4026532291 mnt 1 134689 ubuntu /usr/bin/podman
ubuntu@ubuntu:~$
ubuntu@ubuntu:~$
ubuntu@ubuntu:~$ sudo lsns
NS TYPE NPROCS PID USER COMMAND
4026531834 time 115 1 root /sbin/init
4026531835 cgroup 115 1 root /sbin/init
4026531836 pid 112 1 root /sbin/init
4026531837 user 113 1 root /sbin/init
4026531838 uts 112 1 root /sbin/init
4026531839 ipc 115 1 root /sbin/init
4026531840 net 115 1 root /sbin/init
4026531841 mnt 101 1 root /sbin/init
4026531862 mnt 1 25 root kdevtmpfs
4026532284 mnt 1 414 root /lib/systemd/systemd-udevd
4026532285 uts 1 414 root /lib/systemd/systemd-udevd
4026532286 mnt 1 469 systemd-timesync /lib/systemd/systemd-timesyncd
4026532287 uts 1 469 systemd-timesync /lib/systemd/systemd-timesyncd
4026532288 mnt 1 572 systemd-network /lib/systemd/systemd-networkd
4026532289 mnt 1 608 systemd-resolve /lib/systemd/systemd-resolved
4026532290 user 1 134689 ubuntu /usr/bin/podman
4026532291 mnt 1 134689 ubuntu /usr/bin/podman
4026532292 mnt 1 5369 root /usr/libexec/upowerd
4026532293 user 1 5369 root /usr/libexec/upowerd
4026532295 mnt 2 134974 root unshare --fork --pid --mount-proc /bin/bash
4026532296 pid 2 134975 root /bin/bash
4026532297 mnt 2 134981 root unshare --fork --pid --mount-proc /bin/zsh
4026532298 pid 1 134982 root /bin/zsh
4026532345 uts 1 655 root /lib/systemd/systemd-logind
4026532346 mnt 1 631 root /usr/sbin/irqbalance --foreground
4026532347 mnt 1 655 root /lib/systemd/systemd-logind
4026532348 mnt 1 678 root /usr/sbin/ModemManager
ubuntu@ubuntu:~$
此外,Ubuntu 系统的 init 进程名称不同:systemd
vs /sbin/init
。这是什么原因?谢谢。
我在从 Intel Optane(我刚从 ebay 收到)启动全新的 Ubuntu 24.04.1 时遇到了一些问题:启动过程运行很快,但有时一些 systemd 单元在启动过程中不运行,系统启动时没有 NetworkManager 或其他东西,如 snapd-apparmor。journalctl 日志报告存在排序周期。尝试找到它们时,我注意到systemd-analyze verify multi-user.target
几乎每次运行它时都会报告不同的内容:
$ sudo systemd-analyze verify multi-user.target 2>&1 | grep -i netwo | wc -l
7
$ sudo systemd-analyze verify multi-user.target 2>&1 | grep -i netwo | wc -l
13
$ sudo systemd-analyze verify multi-user.target 2>&1 | grep -i netwo | wc -l
0
$ sudo systemd-analyze verify multi-user.target 2>&1 | grep -i netwo | wc -l
0
$ sudo systemd-analyze verify multi-user.target 2>&1 | grep -i netwo | wc -l
18
由于对来自 ebay 的磁盘有怀疑,我在之前安装在 Corsair NVMe 上的 Ubuntu 22.04 上尝试了同样的操作,结果相同:
$ sudo systemd-analyze verify multi-user.target 2>&1 | grep -i netwo | wc -l
16
$ sudo systemd-analyze verify multi-user.target 2>&1 | grep -i netwo | wc -l
22
$ sudo systemd-analyze verify multi-user.target 2>&1 | grep -i netwo | wc -l
44
$ sudo systemd-analyze verify multi-user.target 2>&1 | grep -i netwo | wc -l
24
$ sudo systemd-analyze verify multi-user.target 2>&1 | grep -i netwo | wc -l
4
$ sudo systemd-analyze verify multi-user.target 2>&1 | grep -i netwo | wc -l
14
Corsair NVMe 上的启动过程也存在类似的问题,即无法启动某些 systemd 单元。但这种情况不太常见。
为什么会发生这种情况?我是否遗漏了什么systemd-analyze verify
?为什么systemd-analyze verify
每次运行时都会报告不同的循环次数?
版本。在英特尔傲腾上:
$ systemd --version
systemd 255 (255.4-1ubuntu8.4)
+PAM +AUDIT +SELINUX +APPARMOR +IMA +SMACK +SECCOMP +GCRYPT -GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN +IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 -PWQUALITY +P11KIT +QRENCODE +TPM2 +BZIP2 +LZ4 +XZ +ZLIB +ZSTD -BPF_FRAMEWORK -XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=24.04
DISTRIB_CODENAME=noble
DISTRIB_DESCRIPTION="Ubuntu 24.04.1 LTS"
之前在 Corsair NVMe 上安装的情况(lspci
实际上报告为 Phison Electronics Corporation E12):
$ systemd --version
systemd 249 (249.11-0ubuntu3.12)
+PAM +AUDIT +SELINUX +APPARMOR +IMA +SMACK +SECCOMP +GCRYPT +GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN +IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 -PWQUALITY -P11KIT -QRENCODE +BZIP2 +LZ4 +XZ +ZLIB +ZSTD -XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=22.04
DISTRIB_CODENAME=jammy
DISTRIB_DESCRIPTION="Ubuntu 22.04.5 LTS"
我以“Ubuntu”用户身份登录 SSH 到服务器上。但是我想以另一个用户“ABC”身份管理运行一些 systemd 服务。
如果我尝试sudo -u abc bash
以用户身份执行此操作ABC
,则每个systemd --user
命令都会出现错误:
Failed to connect to bus: No medium found
我发现这个线程建议添加以下内容~/.bashrc
:
export XDG_RUNTIME_DIR="/run/user/$UID"
export DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus"
这会将错误更改为:
Failed to connect to bus: No such file or directory
其他消息来源表明,无头服务器通常不会安装 dbus,因此这是有道理的(它似乎是 x11 的一个组件)。虽然我不知道为什么如果我将其作为 运行,它会毫无问题地运行ubuntu
。
我发现这个建议的解决方法
sudo systemctl -M abc@ --user restart foobar.service
这对于基本start
、stop
有效,status
但是:
systemctl --user cat
不起作用- 似乎没有任何变化
journalctl
有效:
Failed to open root directory of machine 'abc@': The name org.freedesktop.machine 1 was not provided by any .service files
Failed to open journal: No route to host
- 打字太长,不方便。
我真的只是想要一个这个其他用户的 shell,就像我登录时一样,ubuntu
并且可以毫无问题地管理我的所有用户服务。
我提到 Podman 是因为当我以其他用户身份运行 Podman 时,它也会非常不高兴。如果我以 身份使用它,它会正常工作,ubuntu
但如果我以 运行它,就会出错sudo -u
。像 systemd 一样,我有一些部分解决方法,但似乎都没有效果好。