2017-12-19 1 views
0

Linux에서 모든 터미널 명령을 기록해야합니다. 나는 제대로 C에서 라이브러리 작업 발견했다,하지만 난 LD_PRELOAD=/usr/local/bin/bashpreload.so /bin/bash 실행하는 경우에만 작동합니다서버에 로그인 할 때마다 LD_PRELOAD가 표시됩니다.

[[email protected] ~]# LD_PRELOAD=/usr/local/bin/bashpreload.so /bin/bash 
[[email protected] ~]# 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) 
[[email protected] ~]# exit 
[[email protected] ~]# logout 
Connection to XXX closed. 
[[email protected] ~]$ ssh [email protected] 
[email protected]'s password: 
Last login: Tue Dec 19 11:28:22 2017 from YYY 
[[email protected] ~]# 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) 
:이 후 시스템에 다시 로그인하면

# 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 디렉토리를 볼 수 없습니다를

그리고 또 하나의 문제 :이 라이브러리를 사용하는 경우, 내 현재의 PID가 변화 : 그래서

Last login: Tue Dec 19 11:28:54 2017 from YYY 
[[email protected] ~]# echo "Library is not uploaded" 
Library is not uploaded 
[[email protected] ~]# echo $$ 
4639 
[[email protected] ~]# LD_PRELOAD=/usr/local/bin/bashpreload.so /bin/bash 
[[email protected] ~]# echo $$ 
4654 
[[email protected] ~]# 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: [email protected]/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: [email protected]/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 과정에서 일하고 있습니다.

고마워요!

+0

스택 오버플로는 프로그래밍 및 개발 질문을위한 사이트입니다. 이 질문은 프로그래밍이나 개발에 관한 것이 아니기 때문에 주제와는 거리가 먼 것처럼 보입니다. 도움말 센터에서 [여기에서 내가 질문 할 수있는 항목은 무엇입니까?] (http://stackoverflow.com/help/on-topic)를 참조하십시오. 아마도 [Super User] (http://superuser.com/) 나 [Unix & Linux Stack Exchange] (http://unix.stackexchange.com/)가 더 나은 곳이 될 것입니다. – jww

답변

1

: 당신은 /etc/security/pam_env.conf에 SSH를 통해 로그인 사용자 전에 환경 변수를 추가 할 수 있습니다, 구문 같은 :

LD_PRELOAD  DEFAULT=  OVERRIDE="/usr/local/bin/bashpreload.so" 
1
  1. Find the way to do LD_PRELOAD quietly for each logging in user

당신은 /etc/profile 또는 /etc/environment 등의 모든 사용자에 대해 어딘가에 일반적인 설정해야합니다. 자세한 옵션/세부 정보는 How to set environment variable for everyone under my linux system?을 참조하십시오. 솔직

  1. Know why after this I'm working in the child /bin/bash process.

- 당신이 프로세스를 만들 때마다이 그 PID는 부모와 다른 : 당신이 /bin/bash를 실행하면, 당신은 분명히 다른 쉘을 생성하고 $$이 다른 이유입니다. 이것은 LD_PRELOAD과 아무 관련이 없습니다. /bin/bashLD_PRELOAD없이 실행하면 똑같은 동작을 관찰하게됩니다.

+0

고마워, 나는 아직도 LD_PRELOAD가 어떻게 작동하는지 더 명확히 이해하지 못한다./etc/profile을 사용한 해결책은 좋지만, 쉘 스크립트로 라이브러리를 추가하는 방법을 설명 할 수 있습니까? 'LD_PRELOAD /usr/local/bin/mylib.so/bin/bash'를 추가하면 충분합니까? UPD. 그것은 작동하지 않는다 : (나는'export'를 사용할 수 없다. 왜냐하면이 lib가/bin/bash에만 필요하기 때문이다. –

+0

'LD_PRELOAD =/usr/local/bin/bashpreload.so'는/etc/profile을 참조하십시오. 그러나 LD_PRELOAD 라이브러리의 기능에 따라 사용자를 심각하게 위협 할 수 있으며 보안상의 취약성이있을 수 있으므로 매우주의하십시오 (셸 관련 옵션은 https://unix.stackexchange.com/q/117467/192153 참조). 만약 당신이 단지 bash를 원한다면'bashrc' 파일을 볼 수 있습니다. – usr

2

이것은 클래식 XY problem입니다. 사용자 작업을 기록하고 솔루션을 결정해야하며 해당 솔루션에 대한 질문을해야합니다.

솔루션이 작동하지 않더라도.

LD_PRELOAD 라이브러리를 사용하면 신뢰할 수있는 사용자 명령 로그 방법이 아니므로.

  1. 사용자는 LD_PRELOAD 환경 변수의 설정을 해제 할 수 있습니다. 그리고 아니, marking it readonly doesn't work. 이것은 사용자가 제어하는 ​​프로세스의 메모리에있는 변수이기 때문입니다.
  2. LD_PRELOAD을 64 비트 공유 객체로 설정하고 있습니다. 모든 32 비트 프로그램은 이제 실행되지 않습니다.
  3. 미리로드 된 라이브러리는 데이터를 기록하지만 사용자의 권한/액세스 권한으로 데이터를 기록합니다. 따라서 사용자는 기록 된 데이터를 스푸핑 할 수 있습니다.

사용자의 작업을 기록하려면 안전하게 수행하도록 설계된 시스템 인 auditing을 사용하십시오.누군가가 것입니다 저와 같은 필요한 경우

+0

제 경우에 대한 최선의 해결책은 감사가 아닙니다. 저는 오늘 대안을 모색하고 있습니다. 당신의 충고에 감사드립니다. 32 비트 프로그램이 실패하게되는 이유는 저에게 중요합니다. –

+0

"LD_PRELOAD를 64 비트 공유 객체로 설정하면 모든 32 비트 프로그램을 실행할 수 없습니다"라는 말이 참이 아닙니다 .ELF 클래스가 다른 경우 무시되며 무시됩니다. 진단 메시지와 32 비트 프로그램은 여전히 ​​정상적으로 작동합니다. – usr

+0

@usr * I ELF 클래스가 다르면 무시됩니다. ** ** WRONG **. 'file/usr/bin/bash'를 시도해보십시오. '/ usr/bin/bash : ELF 64-bit LSB ... '가 보일 것입니다. 그런 다음 32 비트 ** 공유 객체 인'export LD_PRELOAD =/lib/libc.so'를 작성하십시오. 그 후에'/ usr/bin/bash'를 입력하여'bash'의 다른 복사본을 실행하십시오. 'LD_PRELOAD'에 의해로드되도록 지정된 32 비트 공유 오브젝트가'ld.so.1 : bash : fatal : ELF class : ELFCLASS32'가 잘못되었습니다. –

관련 문제