유닉스 권한

유닉스 권한

나는 현재 지난 10초 이내에 내 메일을 받은 서버가 작업을 수행하도록 허용하여 내 메일 시스템을 향상시키려고 노력하고 있습니다.신원찾다. 필수 iptables 규칙이 완벽하게 작동하지만 설치하는 데 문제가 있습니다.승인하다팩.

명령줄에서 호출하면 in.authd원하는 결과가 생성됩니다.

# in.authd -t60 --xerror --os -E 993,53558
993 , 53558 : USERID : OTHER :[U2FsdGVkX19EFvZ6dxXLJJl2oKKW/PVOKmX5ER0WWWs=]

그러나 웹 소켓을 통해 동일한 작업을 시도하면 최대 10초의 지연이 발생하고 다음 오류가 발생합니다.

# time echo 993, 53558 | nc localhost 113
993 , 53558 : ERROR :NO-USER

real    0m5.036s
user    0m0.003s
sys 0m0.007s

이 지연으로 인해 시간 초과를 일으키는 권한 문제가 있다고 생각하게 되었습니다. authd의 소스 코드를 보면 /proc/net/tcp*읽기가 실패하거나 이러한 파일 조회가 반복적으로 실패하는 경우 이런 일이 발생할 수 있습니다. 하지만:

유닉스 권한

사용자 식별

# finger ident
Login: ident                    Name: 
Directory: /                            Shell: /sbin/nologin
Never logged in.
No mail.
No Plan.

그룹 멤버십

# id ident
uid=98(ident) gid=98(ident) groups=98(ident)

이를 감안할 때 in.authdident 사용자로 호출하면 예상대로 작동합니다.

# sudo -u ident in.authd -t60 --xerror --os -E 993,53558
993 , 53558 : USERID : OTHER :[U2FsdGVkX1/CxIcvTsEmTnhLSGjnwZ/X9TCwQ4ovZXk=]

파일 권한

# ls -alZ /proc/net/tcp*
-r--r--r--. root root system_u:object_r:proc_net_t:s0  /proc/net/tcp
-r--r--r--. root root system_u:object_r:proc_net_t:s0  /proc/net/tcp6

SELinux

여기에는 의심스러운 것이 없습니다.

# grep ident /var/log/audit/audit.log | audit2why
Nothing to do
# grep auth /var/log/audit/audit.log | audit2why
Nothing to do

나는 아이디어가 조금 부족합니다. in.authd루트로 부팅을 허용하는 경우 에도 이런 현상이 발생합니다. journalctl문제의 장치가 실패한 상태로 전환되었음을 기록하기 때문에 별로 도움이 되지 않습니다.

# journalctl -ln5 --unit=auth@*
systemd[1]: Started Authd Ident Protocol Requests Server ([::1]:55841).
systemd[1]: Starting Authd Ident Protocol Requests Server ([::1]:55841)...
systemd[1]: auth@7-::1:113-::1:55841.service: main process exited, code=exited, status=1/FAILURE
systemd[1]: Unit auth@7-::1:113-::1:55841.service entered failed state.
systemd[1]: auth@7-::1:113-::1:55841.service failed.

"디버그" 모드 로 들어가면 in.authd(그렇게 부를 수 있는 경우) 다른 정보는 공개되지 않습니다. --username출력의 정확성보다 대기 시간이 더 중요하기 때문에 사용자 이름을 적용하는 기능이 부족합니다 . 물론, 가상 사용자가 많은 호스팅 시대에 값을 반환하는 것은 애초에 제대로 이루어지기 어렵지만, 여기서 의미 있는 것을 반환한다는 아이디어가 정말 마음에 듭니다. 도움을 주시면 감사하겠습니다.

답변1

다른 사람들도 같은 함정에 빠지지 않기를 바랍니다. 사실 모든 것이 괜찮습니다. authd 문서의 테스트 섹션에서:

" "를 실행 telnet localhost auth하고 두 개의 포트를 쉼표로 구분하여 입력합니다.선택한 두 포트에는 localhost 또는 127.0.0.1의 외부 주소와 일치하는 로컬 주소가 있어야 합니다.그렇지 않으면 NO-USER 오류가 반환됩니다.

관련 정보