위치결정 명령이 출력되지 않습니다.

위치결정 명령이 출력되지 않습니다.

유닉스 관련 질문은 모두 질문과 답변 형식으로 게시되어 있는 것을 흔히 발견합니다. 하지만 이 특별한 질문 때문에 지난 한 시간 동안 저를 꼼짝 못하게 만들었기 때문에 이 사이트에서 첫 번째 질문을 해야겠다고 생각했습니다.

질문

CentOS 5.11을 실행하는 개발/스테이징 서버가 있습니다. locate일반 사용자로 실행하면 출력이 생성되지 않습니다(오류 메시지도 표시되지 않음).

locate readdir

그러나 슈퍼유저로 명령을 실행하면 유효한 결과 목록이 인쇄됩니다.

$ sudo locate readdir
/home/anthony/repos/php-src/TSRM/readdir.h
/home/anthony/repos/php-src/ext/standard/tests/dir/readdir_basic.phpt
... etc.

strace일반적으로 이러한 문제를 디버깅하고 strace locate readdir쇼를 실행하는 데 도움이 됩니다.

stat64("/var/lib/mlocate/mlocate.db", 0xbff65398) = -1 EACCES (Permission denied)
access("/", R_OK|X_OK)                  = -1 EACCES (Permission denied)
exit_group(1)                           = ?

권한 확인

locate바이너리와 기본 데이터베이스의 소유권과 권한을 확인했습니다. 예상한 대로 명령은 그룹 소유자 setgid로 작동하며 데이터베이스에는 적절한 소유권과 권한이 있습니다.slocate

$ ls -l /usr/bin/locate
-rwx--s--x 1 root slocate 22280 Sep  3  2009 /usr/bin/locate

$ sudo ls -l /var/lib/mlocate/mlocate.db
-rw-r----- 1 root slocate 78395703 May  8 04:02 /var/lib/mlocate/mlocate.db

$ sudo ls -ld /var/lib/mlocate/
drwxr-x--- 2 root slocate 4096 Sep  3  2009 /var/lib/mlocate/

다음 중 특이한 파일 속성은 없습니다.

$ sudo lsattr /usr/bin/locate /var/lib/mlocate/mlocate.db
------------- /usr/bin/locate
------------- /var/lib/mlocate/mlocate.db

작업 시스템과 비교

그 사이 프로덕션 서버의 모든 것이 예상대로 실행됩니다. 루트가 아닌 일반 사용자로 실행하면 locate readdir예상되는 결과 목록이 반환됩니다.

$ locate readdir
/usr/include/php/TSRM/readdir.h
/usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/POSIX/readdir.al
/usr/share/man/man2/readdir.2.gz

비교를 위해 이 명령도 실행했지만 strace스테이징 서버에서와 동일한 권한 거부 오류가 발생했습니다. 를 읽을 때까지 무슨 일이 일어나고 있는지 궁금했습니다 sudo.곤충부분:

setuid 비트를 사용하는 프로그램은 추적 시 유효한 사용자 ID 권한이 없습니다.

그래서 아쉽게도 디버깅에는 사용할 수 없습니다 strace.

위의 모든 명령의 결과를 스테이징 서버와 프로덕션 서버에서 비교해 보았는데 둘 사이에는 차이가 없습니다. 두 시스템 모두 mlocate-0.15-1.el5.2그림과 같이 파일을 수정하지 않고 RPM을 갖습니다 rpm -V mlocate.

기타 고려사항

문제의 스테이징 서버에서 내 로그인이 Winbind를 사용하여 인증되었지만 동일한 상자에 일반 로컬 사용자를 생성했지만 여전히 동일한 문제가 있다는 사실과 관련이 있을 수 있다고 생각합니다. 분명히 다른 것이 누락된 것 같지만 그것이 무엇인지 전혀 모릅니다.

나는 이것이 setgid 파일 권한, 아마도 PAM, 아마도 SELinux와 관련이 있다고 생각합니다. 저는 PAM이나 SELinux에 대해 잘 모릅니다. Winbind 인증을 구성할 때 PAM만 보았고 SELinux는 운영 체제와 함께 설치되지만 사용한 적이 없습니다.

참고: 일부 실험을 통해 프로덕션 서버는 개발 서버보다 수정 사항이 훨씬 적습니다.

답변1

문제는 /(루트 디렉터리의) 권한이며 단서는 출력의 다음 줄입니다 strace.

access("/", R_OK|X_OK)                  = -1 EACCES (Permission denied)

그룹 읽기 권한 설정이 누락되었습니다 /. 그러나 x디렉터리를 탐색할 수 있는 (실행) 권한이 여전히 있으므로 파일 시스템의 모든 파일에 계속 액세스할 수 있습니다. 이것이 바로 이러한 권한이 적용되는 동안 대부분의 작업이 계속 작동하는 이유입니다. 당신이 할 수 없는 유일한 일은 나열된 것입니다 /. 대부분의 명령에는 list 가 필요하지 않으며 /현재 디렉토리에 상대적인 경로 이름을 사용하거나 루트 디렉토리 외부의 잘 알려진 특정 디렉토리(예: /etc/var)에 액세스하는 절대 경로 이름을 사용합니다.

보안상의 이유로 locate권한이 있는 사용자가 생성한 파일 이름의 전체 목록에 액세스할 수 있지만 호출 사용자가 루트에서 전체 파일 시스템을 검색하여 찾을 수 있는 결과만 보고해야 한다고 주장합니다. 을 나열할 수 없으므로 /루트에서 직접 아무것도 검색할 수 없으므로 locate아무 것도 보고되지 않습니다.

답변2

Celada의 예리한 눈과 세부 사항에 대한 관심 덕분에 루트 디렉터리에 대한 권한을 확인했습니다.

$ sudo ls -ld /
drwx--xr-x 25 root domain users 4096 Apr 22 17:57 /

이는 Active Directory 자격 증명을 사용하여 인증할 때 domain usersWinbind가 나에게 할당하는 기본 그룹입니다 . 얼마 전에 그룹 소유권을 변경하고 그룹의 읽기 액세스를 제거하여 다른 사용자의 디렉터리 집합에 대한 읽기 액세스를 거부했습니다. 실수로 루트 디렉토리에 동일한 작업을 수행한 것이 틀림없습니다. 아야! 흥미롭게도 그것은 몇 주 전이었고 어떤 문제도 발견하지 못했습니다. 비록 이것은 일반 사용자로 로그인하고 루트로 로그인하는 대신 sudo를 사용하기로 한 의식적인 결정과 일치했지만.

어쨌든 권한을 원래대로 다시 변경했습니다.

$ sudo chgrp root /
$ sudo chmod -v g+r /
mode of `/' changed to 0755 (rwxr-xr-x)

$ ls -ld /
drwxr-xr-x 25 root root 4096 Apr 22 17:57 /

지금은 locate잘 작동합니다 .

관련 정보