로그인 쉘로서 / usr / sbin / nologin이 보안 목적으로 사용됩니까?


77

내에서 /etc/passwd파일, 나는 것을 볼 수 있습니다 www-data아파치가 사용하는 사용자뿐만 아니라 시스템 사용자의 모든 종류가 하나가 /usr/sbin/nologin/bin/false자신의 로그인 쉘로. 예를 들어, 다음은 선택된 행입니다.

daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
games:x:5:60:games:/usr/games:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
syslog:x:101:104::/home/syslog:/bin/false
whoopsie:x:109:116::/nonexistent:/bin/false
mark:x:1000:1000:mark,,,:/home/mark:/bin/bash

결과적으로, 이러한 사용자 중 한 명으로 바꾸려고 할 때 (때로는 권한에 대한 이해를 확인하고 적어도 절반 이상의 제정신의 이유가있는 경우가 있음) 실패합니다.

mark@lunchbox:~$ sudo su www-data
This account is currently not available.
mark@lunchbox:~$ sudo su syslog
mark@lunchbox:~$ 

물론 다음과 같은 방법으로 쉘을 시작할 수 있기 때문에 불편하지 않습니다.

mark@lunchbox:~$ sudo -u www-data /bin/bash
www-data@lunchbox:~$ 

그러나 이것은 사용자에게 로그인 쉘을 거부함으로써 어떤 목적 이 제공 되는지 궁금합니다 . 설명을 위해 인터넷을 둘러 보는 많은 사람들은 이것이 보안과 관련이 있다고 주장하며 모든 사람들은 이러한 사용자의 로그인 쉘을 변경하는 것이 어떤 식 으로든 나쁜 생각에 동의하는 것 같습니다. 인용문 모음은 다음과 같습니다.

Apache 사용자의 쉘을 비 대화식으로 설정하는 것은 일반적으로 좋은 보안 관행입니다 (대화식으로 로그인 할 필요가없는 모든 서비스 사용자는 쉘이 비 대화식으로 설정되어야합니다).

-https : //serverfault.com/a/559315/147556

사용자 www-data의 쉘은 / usr / sbin / nologin으로 설정 되어 있으며 매우 좋은 이유가 있습니다.

-https : //askubuntu.com/a/486661/119754

[시스템 계정] 특히 쉘이 활성화 된 경우 보안 허점이 될 수 있습니다 .

  • 나쁜

    bin:x:1:1:bin:/bin:/bin/sh
  • 좋은

    bin:x:1:1:bin:/bin:/sbin/nologin

-https : //unix.stackexchange.com/a/78996/29001

보안상의 이유로 Tomcat 서버를 실행하기 위해 로그인 셸이없는 사용자 계정을 만들었습니다.

# groupadd tomcat
# useradd -g tomcat -s /usr/sbin/nologin -m -d /home/tomcat tomcat

-http: //www.puschitz.com/InstallingTomcat.html

이 게시물은 만장일치로 동의하지만 시스템 사용자에게 실제 로그인 셸을 제공하지 않으면 보안에 도움이되지만 그중 하나는이 주장을 정당화 할 수 없으며 어느 곳에서도 설명을 찾을 수 없습니다.

이러한 사용자에게 실제 로그인 쉘을 제공하지 않음으로써 우리 자신을 보호하려는 공격은 무엇입니까?


답변:


51

당신이 한 번 봐 걸릴 경우 nologinman 페이지에는 다음과 같은 설명을 볼 수 있습니다.

발췌

nologin은 계정을 사용할 수없고 0이 아닌 종료 메시지를 표시합니다. 계정에 대한 로그인 액세스를 거부하기위한 대체 쉘 필드로 사용됩니다.

파일 /etc/nologin.txt이 존재 nologin하면 기본 메시지 대신 해당 내용을 사용자에게 표시합니다.

에 의해 리턴되는 종료 코드 nologin는 항상 1입니다.

따라서 실제 의도 nologin는 사용자가 계정을 사용하는 계정으로 로그인하려고 할 때 /etc/passwd사용자에게 친숙한 메시지가 표시되고이를 사용하려는 모든 스크립트 / 명령이 표시되도록하는 것입니다. 이 로그인은 종료 코드 1을받습니다.

보안

보안과 관련하여 일반적으로 해당 분야의 다른 것들 중에서 하나 /sbin/nologin또는 때때로 볼 수 있습니다 /bin/false. 둘 다 동일한 목적으로 사용되지만 /sbin/nologin선호되는 방법 일 수 있습니다. 어쨌든 그들은이 특정 사용자 계정으로 쉘에 대한 직접 액세스를 제한하고 있습니다.

이것이 보안과 관련하여 왜 가치있는 것으로 간주됩니까?

"이유"를 완전히 설명하기는 어렵지만 이러한 방식으로 사용자 계정을 제한하는 것은 사용자 계정을 login사용하여 액세스하려고 할 때 응용 프로그램을 통한 직접 액세스를 방해한다는 것 입니다.

이 중 하나를 사용 nologin하거나 /bin/false달성합니다. 시스템의 공격 영역을 제한하는 것은 특정 포트에서 서비스를 비활성화하거나 시스템의 로그인 특성을 제한하는 등 보안 분야에서 일반적으로 사용되는 기술입니다.

또 사용하는 다른 합리화가있다 nologin. 예를 들어, scp이 ServerFault Q & A에 설명 된대로 / sbin / nologin과 / bin / false의 차이점은 무엇입니까? .


They both serve the same purpose, but /sbin/nologin is probably the preferred method.보안 관점에서`/ sbin / nologin '은 선호되는 방법이 아닙니다. 응답을 제공하는 시간과주기를 낭비합니다. 특히 좋은 보안을 제공하지는 않지만; 심층 방어 수단이지만 실제로 특정 사용자가 명령을 실행하는 것을 막지는 않습니다.
Parthian Shot

4
@ParthianShot 사용자를 위해 실행할 쉘을 찾기 위해 OS가 수행하는 모든 작업과 관련하여 단일 하드 코딩 된 문자열을 에코하는 데 필요한 시간과 사이클은 서비스 거부를 구성하는 사람에게는 중요하지 않은 것처럼 보입니다. 공격. SLM이 제안되고 nologinUX 이유가 아닌 보안 사람을위한 선호하는 방법입니다 - 일을 sudo su someuser그냥 가지고 아무것도 일어나지 자신의 로그인 쉘이기 때문에 것은 false혼란이다. 또한,이 두 가지 않습니다 여기 답변에 설명 된 특정 상황에서 특정 사용자로 명령을 실행하지 못하도록.
Mark Amery

28

확실히 보안 목적으로 사용됩니다. 예를 들어, 쉘을 가지고있는 시스템 사용자를 위해 제출 된 아래 버그를 보십시오 .

데몬 계정에 유효한 로그인 쉘이 있고 인터넷 액세스를 위해 삼바가 열려있어 데비안 서버가 손상되었습니다. 데몬 계정에 대해 samba를 통해 비밀번호를 원격으로 설정하고 ssh를 통해 로그인하여 침입했습니다. 그런 다음 일부 로컬 루트 익스플로잇을 사용하여 서버를 소유했습니다.

Gilles 가이 버그에 대한 링크를 제공 한이 멋진 답변 을 읽는 것이 좋습니다 .

데비안 (274229, 330882, 581899)에서이 문제에 대해 버그가 제기되었으며, 현재 열려 있고 "wishlist"로 분류되어 있습니다. 나는 이것이 버그이며 시스템 사용자가 달리 할 필요가없는 한 / bin / false를 쉘로 가지고 있어야한다는 데 동의하는 경향이 있습니다.


... 실제로 사용자의 선언 된 셸에 실제로 어떻게 의존하는지 알 수 없습니다. 공격자가 실행 ssh user@site하고 작동 ssh user@site /bin/bash했지만 계속 시도 하지는 않지만 선언 된 셸에 관계없이 여전히 작동한다고 확신합니다.
Parthian Shot

2
@ParthianShot, 일화적인 증거 : CentOS 서버에서 계정의 셸이 / sbin / nologin으로 설정 ssh user@site /bin/bash되면 간단한 This account is currently not available.메시지가 반환 됩니다. 또한, 이 답변이 nologin으로 보호 SSH 액세스는 말한다
metavida

설명을 기반으로 @ParthianShot은 발생하지 않았습니다. 발생한 일 : 삼바가 잘못 구성되었습니다. 공격자는 Samba를 통한 ssh 액세스를 구성했습니다. 공격자가 ssh를 통해 로그온했습니다. 이 경우는 분명히 sysadmin의 결함이지만 "잘못 구성된 Samba"를 "취약한 서비스"로 바꾸면 로그인 액세스를 막는 것이 공격의 범위를 줄여줍니다. 물론, 익스플로잇이 로컬 실행을 허용하면 ssh 액세스 권한이 아닌 ssh 액세스 권한을 갖는 경우 별 차이가 없습니다.
마커스

18

@slm과 @ramesh의 탁월한 답변을 추가하려면 :

예, 지적한 바와 sudo같이, 정의 된 쉘로 실행 하여 nologin을 기본 쉘로 사용하는 사용자로 계속 전환 할 수 있지만이 경우 다음을 수행해야합니다.

  1. 유효한 쉘이있는 다른 사용자로 로그인
  2. 해당 사용자에 대해 sudo 권한을 구성하여 su명령 을 실행 하고
  3. sudo가 sudoers 로그에 기록되었습니다 (물론 sudo 로깅이 활성화되었다고 가정).

기본 쉘로 정의 된 nologin을 가진 사용자는 보통 일반 사용자보다 더 높은 권한을 가지고 있거나 시스템에 더 많은 피해를 줄 수 있으므로, 직접 로그인 할 수 없어서 시스템 위반으로 인한 피해를 제한 할 수 있습니다 .


7

주어진 훌륭한 답변 외에도 다른 목적으로 사용됩니다.

서버에서 FTP 데몬을 실행하면 로그인을 시도하는 사용자의 로그인 셸을 확인합니다. 쉘이 목록에 /etc/shells없으면 로그인 할 수 없습니다. 따라서 데몬 계정에 특수 쉘을 제공하면 누군가 FTP를 통해 계정을 수정할 수 없습니다.


7

이미 주어진 위대한 대답 옆에 다음 시나리오를 생각할 수 있습니다.

제한된 사용자로 실행되는 서비스의 보안 버그를 통해 해당 사용자로 파일을 작성할 수 있습니다. 이 파일은 ~ / .ssh / authorized_keys 일 수 있습니다.

이를 통해 공격자는 셸에서 직접 로그인하여 권한 에스컬레이션을 훨씬 쉽게 수행 할 수 있습니다.

로그인 쉘을 허용하지 않으면이 옵션이 훨씬 더 어려워집니다.


1

일반적으로 / bin / false와 / sbin / nologin은 동일하지만 사용중인 SSH 서버에 따라 다릅니다.

OpenSSH에 대한이 최근 익스플로잇이 / bin / false 로그인에는 영향을 미치지 만 / sbin / nologin에는 영향을 미치지 않는 것으로 나타났습니다. 그러나 Dropbear는 이러한 방식으로 다릅니다 (이 익스플로잇은 OpenSSH에도 적용됨).

악용은 대부분의 버전에 영향을줍니다.

7.2p1 이하 (모든 버전, ~ 20 년으로 거슬러 올라갑니다) X11 전달 기능 사용

https://www.exploit-db.com/exploits/39569/

따라서 이것을 기반으로-개인적으로 / sbin / nologin을 수행하지만 이것이 / etc / passwd에서 / bin / false 항목을 생성하는 서비스에 영향을 줄 수 있는지 확실하지 않습니다. 실험하고 결과를 볼 수는 있지만 위험을 감수하십시오. 최악의 경우 다시 변경하고 영향을받는 서비스를 다시 시작할 수 있다고 가정합니다. 나는 개인적으로 / bin / false를 사용하여 꽤 많은 항목을 가지고 있습니다-X11 전달이 내가 활성화 한 것이 아니기 때문에 이것을 귀찮게하고 싶은지 확실하지 않습니다.)

OpenSSH를 사용하고 (많은 사람들이 생각합니다 ...) X11 전달을 사용하도록 설정 한 경우 / sbin / nologin (또는 Dropbear로 전환)을 고려할 수 있습니다.


0

일반적으로 서비스 및 응용 프로그램 계정을 비 대화식 로그인으로 설정하는 것이 좋습니다. 권한이있는 사용자는 여전히 SU 또는 SUDO를 사용하여 해당 계정에 액세스 할 수 있지만 모든 작업은 Sudoers 로그 파일에서 추적되며 서비스 계정 권한으로 명령을 실행 한 사용자에게 다시 추적 될 수 있습니다. 따라서 시스템 관리자가 로그 파일을 변경할 수 없도록 중앙 로그 관리 시스템에 로그 파일을 저장해야합니다. SU 또는 SUDO에서 명령을 실행하는 사용자는 이미 시스템에 액세스 할 권한이 있습니다.

반면, 시스템에 대한 외부 또는 무단 사용자는 해당 계정을 사용하여 로그인 할 수있는 권한이 없으며 이는 보안 조치입니다.


0

예, 보안 목적으로 사용됩니다. 심층 방어 측정입니다.

이것이 목적이되는 핵심 이유는 지정된 사용자에 대해 어떤 형태의 로그인 자격 증명을 검증 한 다음 해당 사용자의 로그인 쉘을 사용하여 명령을 실행하는 다양한 소프트웨어 비트가 있기 때문입니다. 아마도 가장 주목할만한 예는 SSH입니다. SSH를 통해 사용자로 성공적으로 인증되면 SSH는 사용자의 로그인 쉘을 시작합니다 (또는 ssh someuser@example.com 'command to run'구문 을 사용하는 경우 사용자가 제공 한 명령을 실행하는 데 사용 ).

물론 공격자는 사용자로 전혀 인증 할 수없는 것이 이상적입니다. 그러나 다음 상황이 발생한다고 가정하십시오.

  • 제어하는 서버는 홈 디렉토리와 로그인 쉘이있는 사용자로 웹 서비스를 실행 중입니다.
  • 침입자는 해당 서비스에서 취약점을 발견하여 침입자가 사용자의 홈 디렉토리에 파일을 쓸 수있게합니다.

이제 공격자는 SSH 공개 키를 작성한 ~/.ssh/authorized_keys다음 SSH를 입력하고 붐을 칠 수 있습니다! -서버에 쉘 액세스 권한이 있습니다.

사용자가 대신 /usr/sbin/nologin로그인 셸을 사용하는 경우 공격자가 공개 키를 성공적으로 작성한 후에도 authorized_keys유용하지 않습니다. 그들이 할 수있는 것은 원격으로 실행 nologin하는 것입니다. 매우 유용하지 않습니다. 그들은 포탄을 얻을 수 없으며 공격이 완화되었습니다.

이 시나리오가 매우 가정적인 것처럼 보일 경우 ,이 질문을 한 지 약 1 년 후인 2015 년 어느 시점에서이 공격을 정확히 목표로 삼았다는 점에 주목하고 싶습니다 . 빌어 먹을 바보처럼, 전 세계에 암호가없는 Redis 인스턴스를 남겼습니다. 공격자가 Redis 데이터베이스에 SSH 공개 키를 삽입 한 다음 Redis에 데이터베이스의 내용을 쓰도록 명령 한 다음 SSH를 시도 하는 Redis crackit 공격의 대상이 .ssh/authorized_keys되었습니다. 결과에서 저장되었습니다. redis-serverRedis를 설치하는 데 사용한 Apt 패키지 의 관리자가 Redis를redis홈 디렉토리 또는 로그인 쉘이없는 사용자; 그것이 아니라면 내 서버가 랜섬웨어이거나 해커의 봇넷의 일부가되었을 수 있습니다.

이러한 경험을 통해 어느 정도 겸손을 얻었고 깊이 방어 의 중요성 , 특히 웹 서버, 데이터베이스 및 기타 백그라운드 서비스를 실행하는 계정에 로그인 셸을 부여하지 않는 것이 중요하다는 점을 알게 되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.