每次登录到服务器的LD_PRELOAD

问题描述 投票:0回答:3

我需要在Linux中记录所有终端命令。我在C中找到了正确的工作库,但它只在我运行LD_PRELOAD=/usr/local/bin/bashpreload.so /bin/bash时才有效:

# ldd /bin/bash
    linux-vdso.so.1 =>  (0x00007ffef59f8000)
    /usr/local/bin/bashpreload.so (0x00007fe691323000)
    libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007fe691102000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007fe690efe000)
    libc.so.6 => /lib64/libc.so.6 (0x00007fe690b6a000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fe691524000)

如果我在此之后再次登录系统,我将不会看到带有ldd的lib:

[root@XXX ~]# LD_PRELOAD=/usr/local/bin/bashpreload.so /bin/bash
[root@XXX ~]# ldd /bin/bash
    linux-vdso.so.1 =>  (0x00007ffe481f6000)
    /usr/local/bin/bashpreload.so (0x00007f3f1b808000)
    libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f3f1b5e7000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007f3f1b3e3000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f3f1b04f000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f3f1ba09000)
[root@XXX ~]# exit
[root@XXX ~]# logout
Connection to XXX closed.
[sahaquiel@sahaquiel-PC ~]$ ssh root@XXX
root@XXX's password: 
Last login: Tue Dec 19 11:28:22 2017 from YYY
[root@XXX ~]# ldd /bin/bash
    linux-vdso.so.1 =>  (0x00007ffca2f98000)
    libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f19a13ff000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007f19a11fb000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f19a0e67000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f19a1620000)

还有一个麻烦:如果我使用这个库,我当前的PID正在改变:

Last login: Tue Dec 19 11:28:54 2017 from YYY
[root@XXX ~]# echo "Library is not uploaded"
Library is not uploaded
[root@XXX ~]# echo $$
4639
[root@XXX ~]# LD_PRELOAD=/usr/local/bin/bashpreload.so /bin/bash
[root@XXX ~]# echo $$
4654
[root@212-24-57-104 ~]# ps awwufx | grep -B5 [4]654
root      1706  0.0  0.0  66256  1192 ?        Ss   10:54   0:00 /usr/sbin/sshd
root      4517  0.0  0.0 104636  4644 ?        Ss   11:27   0:00  \_ sshd: root@pts/1 
root      4519  0.0  0.0 108320  1872 pts/1    Ss+  11:27   0:00  |   \_ -bash
root      4637  0.0  0.0 104636  4624 ?        Ss   11:30   0:00  \_ sshd: root@pts/0 
root      4639  0.0  0.0 108320  1872 pts/0    Ss   11:30   0:00  |   \_ -bash
root      4654  0.0  0.0 110376  1956 pts/0    S    11:31   0:00  |       \_ /bin/bash

所以,我需要两件事:

  1. 找到为每个登录用户安静地做LD_PRELOAD的方法;
  2. 知道为什么在此之后我在孩子/bin/bash过程中工作。

谢谢!

c linux bash ld ld-preload
3个回答
2
投票

这是一个经典的XY problem。您需要记录用户操作,确定解决方案,并询问有关该解决方案的问题。

即使解决方案不起作用。

因为使用LD_PRELOAD库不是记录用户命令的可靠方法。

  1. 用户可以取消设置LD_PRELOAD环境变量。不,marking it readonly doesn't work。因为它只是用户控制的进程内存中的变量。
  2. 您将LD_PRELOAD设置为64位共享对象。现在每个32位程序都无法运行。
  3. 但是,您预加载的库会记录数据,它会使用用户的权限/访问权限进行记录。因此,用户可以欺骗记录的数据。

如果您需要记录用户的操作,请使用旨在安全执行此操作的系统:auditing


1
投票
  1. 找到为每个登录用户安静地执行LD_PRELOAD的方法

您需要为所有用户设置共同点,例如/etc/profile/etc/environment。有关更多选项/详细信息,请参阅How to set environment variable for everyone under my linux system?

  1. 知道为什么在这之后我在child / bin / bash过程中工作。

这是直截了当的 - 每当你创建一个进程时,它的PID与它的父进程不同:)当你运行/bin/bash时,你显然会创建另一个shell,这就是$$不同的原因。这与LD_PRELOAD无关。如果你在没有/bin/bash的情况下运行LD_PRELOAD,你会发现完全相同的行为。


1
投票

如果有人需要和我一样:你可以在用户通过/etc/security/pam_env.conf中的SSH登录之前添加环境变量,语法如下:

LD_PRELOAD     DEFAULT=        OVERRIDE="/usr/local/bin/bashpreload.so"
© www.soinside.com 2019 - 2024. All rights reserved.