SSH 셸 액세스는 사용하지만 SFTP 액세스는 사용하지 않도록 설정


21

나는이 질문에 대한 실용적인 답변을 찾았으며 대부분의 답변에는 왜하지 않는지에 대한 조언이 포함되어 있습니다. 그러나 시나리오는 다음과 같습니다.

콘솔 앱이 있고 각 사용자의 .profile에는 앱에 대한 시작 명령이 있으며,이 명령을 시작한 명령 바로 뒤에 "exit"명령이있어 시스템에서 로그 아웃합니다. 나는 그들이 제공 한 인터페이스를 통해이 콘솔 앱에 액세스 할 수 있기를 원합니다. 시작시 앱은 사용자에게 앱을 통해 액세스 할 수있는 클라이언트 목록을 제공하며 각 클라이언트에는 고유 한 데이터 디렉토리가 있습니다. 사용자에게는 액세스 권한이 필요한 클라이언트 만 액세스 할 수 있습니다.

이제 문제가 있습니다 : 사용자에게 SSH 액세스 권한을 부여하면 SFTP 클라이언트를 사용하여 로그인 할 수도 있습니다 .SFTP 클라이언트는 앱의 데이터 디렉토리에 직접 액세스 할 수 있습니다. 이는 매우 바람직하지 않습니다. 액세스 할 수없는 데이터 디렉토리에 액세스합니다.

이것은 telnet / FTP 조합을 사용할 때 수행해야 할 간단한 일이지만, 인터넷의 어느 곳에서나 사용자에게 액세스를 제공하고 싶기 때문에 SFTP에서 사용자를 종료하는 방법을 찾을 수 없었습니다. 여전히 앱을 실행할 수있는 셸에 액세스 할 수 있습니다.


8
세부 사항을 잊었지만 SSH를 사용하면 사용자가 로그인 할 때 단일 명령을 실행하도록 제한 할 수 있다고 생각합니다.이를 설정하면 전체 셸 액세스 권한을 얻지 못합니다. 사용 사례에 유용 할 수 있습니다. (결국 SSHFS를 사용하여 SFTP 액세스를 에뮬레이션하는 것이 가능합니다. SFTP를 비활성화해도 적당히 결정된 사용자가 자신의 사용자 계정이 액세스 할 수있는 파일에 도달하는 것을 막을 수는 없습니다.)
David Z

3
또한 사용자를 "chrooting"하는 것이 좋습니다. 여분의 데이터 액세스를 위해 디자인 문제처럼 보입니다
Dennis Nolte

2
.profile그것을 사용 하는 것은 잘못된 해결책처럼 들립니다. 대체 쉘을 사용하여 사용자를 설정하면 훨씬 더 의미가 있다고 생각합니다.
kasperd December

3
.profile우회하기는 쉽지 않으므로 트릭 을 사용하여 액세스를 제한 하지 마십시오 . (자세한 내용은 내 대답을 참조)
ALEKSI Torhamo에게

답변:


22

편집하다:

확실하지 않은 경우 다음 대답은 서버에 대한 셸 액세스 권한이있는 사람이 SFTP를 사용하지 못하도록 하는 안전한 방법 이 아닙니다 . 외부 가시성에서 비활성화하는 방법을 설명하는 답변 일뿐입니다. 사용자 수준 보안에 대한 자세한 내용은 @cpast 및 @Aleksi Torhamo의 답변을 참조하십시오. 보안이 당신의 초점이라면,이 대답은 올바른 것이 아닙니다. 단순한 서비스 가시성이 당신의 초점이라면, 이것이 당신의 대답입니다.

우리는 이제 원래의 대답을 계속합니다.


sshd_config에서 sftp 지원을 주석 처리하십시오 (물론 restart sshd).

#Subsystem sftp /usr/lib/openssh/sftp-server


1
때로는 라인이 될 수 있습니다Subsystem sftp internal-sftp
Kondybas

1
나는 Subsystem sftp /usr/libexec/sftp-server 그러나 그 트릭을했다. 대단히 감사합니다
sosaisapunk

16
이것은 그럴듯하게 들리지 않습니다. 서버에서 임의의 명령을 실행할 수 있으면 sftp 서버 측 프로그램을 실행할 수 있습니다. 설치되어 있지 않더라도 긴 쉘 명령으로 다시 구현하고 sftp 클라이언트가 sftp 대신이 명령을 보내도록 할 수 있습니다. 이 방법을 사용하면 sftp를 사용하는 것이 편리하지 않을 수 있지만 임의의 명령을 실행할 수있는 사용자가 해당 명령을 사용하여 파일을 전송하지 못하게하는 방법은 없습니다.
R ..

1
@sosaisapunk 사실이 아닙니다. 사용자는 사용하여 원하는 명령대로 실행할 수 ssh user@host command있기 때문에, .profile당신은 그렇게 할 경우 전혀 실행되지 않으며, 따라서 귀하의 응용 프로그램은 전혀 시작되지 않습니다. 간단히 말하면 셸에 액세스 할 수 있습니다 ssh -t user@host bash. 그냥 시도하면 볼 수 있습니다. 서브 시스템은 명령 별명 일뿐입니다. 이전에 sftp를 사용할 수 있었다면 계속 사용할 수 있으며 원하는 다른 명령을 사용할 수 있습니다. 아래 답변을 읽으십시오.
Aleksi Torhamo

1
@ sosaisapunk : 아니요, 요점은 ssh 로이 작업을 수행 할 수 있지만 .profile보안을위한 것이 아니며 쉽게 우회 할 수는 없기 때문입니다. 내 대답에는 ssh로 수행하는 세 가지 방법이 나와 있습니다. 즉, 단지에서 응용 프로그램의 호출을 이동 .profile쉘 스크립트 및 중 1)) 사용자의 쉘이 같은 쉘 스크립트를 설정 제대로 일치로 쉘 스크립트 () 설정 ForceCommand에서 sshd_config공개 키 인증 3) 스위치 및 설정 command에서 와 같이 쉘 스크립트 .ssh/authorized_keys. (또한 사람들이 댓글을 받도록 @name을 사용해야합니다)
Aleksi Torhamo

28

다른 사람들이 언급했듯이, 비활성화 sftp는 충분하지 않습니다. ssh액세스 가 제한되지 않은 사용자 는 자신의 계정이 볼 수있는 권한이있는 파일을보고, 수정할 권한이있는 파일을 수정할 수 있으며, 자신이 읽을 수있는 모든 것을 쉽게 다운로드 할 수 있습니다 기계. 이 작업을 수행하지 못하게하는 유일한 방법은 실제로 액세스를 제한하는 것입니다. 또한 .profile사용자를 제한 하지 않는 것이 이상적이지 않습니다. (편집 : Aleksi가 그의 답변에서 언급했듯이 실제로 우회 .profile하는 것은 사소한 일 .profile이 아닙니다. 문제는 보안이 아닌 편의를위한 것이므로 그렇지 않습니다. 보안을 위해 아래의 것들과 같은 보안을 위해 설계된 것들을 사용하십시오).

이를 수행하는 두 가지 기본 방법이 있습니다. 파일 권한을 통해 제한하거나 콘솔 앱만 강제로 실행할 수 있습니다. 두 번째 방법은 더 낫습니다. 콘솔 앱으로 제한되어야하는 사용자를 그룹에 할당하십시오 (예 :) customers; 그런 sshd_config다음에 다음 행을 추가하십시오.

Match Group customers
ForceCommand /path/to/app

이 작업은 해당 그룹의 사용자로부터의 모든 연결이 콘솔 앱을 열도록합니다. sftp서버 도구를 포함하여 다른 어떤 것도 시작할 수 없습니다 . 이것은 또한 아무것도에서 그들을 중지 다른 시스템과,과는 달리 .profile그렇게 (SSH 서버 자체를 사용하여 않는 .profile, 쉘에서 그 제한을 ForceCommand또한 쉘을 시작 포함하지 않는 다른 일을 방지). 또한 이와 달리 .profile이것은 보안으로 설계되었습니다 . 악의적 인 사용자가 자신을 회피하는 것을 막기 위해 만들어졌습니다.

(아마도 열등한) 대안은 콘솔 앱을 실행할 새 사용자를 만드는 것입니다. 그런 다음 데이터 디렉토리를 해당 사용자로 제한하고 해당 사용자가 소유 한 콘솔 앱을 설정 u+s한 후 프로그램에서 설정 하십시오. 이것은 setuid비트입니다. 콘솔 프로그램을 실행하는 사람은 프로그램 소유자의 권한으로 그렇게합니다. 그렇게하면 사용자는 디렉토리에 액세스 할 수 없으며 프로그램을 통해서만 디렉토리를 이용할 수 있습니다. 그러나 모든 프로그램이 "이 프로그램 만 실행" ForceCommand하도록 제한 하기 때문에을 사용해야 합니다.


4
ForceCommandSSH 포트 전달을 방해하지 않는 추가하고 싶습니다 .
nyuszika7h

1
실제로, 의존하는 .profile것은 "이상적이지 않은"이상입니다. 그것은 쉽게 우회되며 (자세한 내용은 내 대답을 참조하십시오) 따라서 어떤 보안도 제공하지 않으며 잘못된 보안 감각 만 제공합니다.
Aleksi Torhamo

@AleksiTorhamo 아. 나는 당신이 그것을 우회 할 수 있다고 의심했지만 어떻게 확신하지 못했습니다 (일반적으로 보안을 목적으로하지 않는 것은 우회 할 수 있다고 생각합니다). 방법에 대한 자세한 내용에 감사드립니다!
cpast

15

.profile보안을 제공하지 않으며 정확히 아무것도 제한 하지 않으므로이 작업을 수행하지 마십시오 !

.profile다음과 같이 ssh 명령 행에서 실행할 명령을 제공하여이를 무시할 수 있기 때문에 입력 한 내용은 중요하지 않습니다 ssh user@host command. 여전히을 수행하여 일반적인 쉘 액세스를 얻을 수 있습니다 ssh -t user@host bash.

다른 답변에서 언급했듯이 sftp 하위 시스템을 비활성화해도 전혀 도움이되지 않습니다. 서브 시스템은 본질적으로 명령의 별명 일 뿐이며을 사용하여 sftp를 정상적으로 사용할 수 있습니다 sftp -s /path/to/sftp-executable user@host.

cpast와 일부 주석 작성자가 말했듯이 액세스를 제한하기 위해 적절한 메커니즘을 사용해야합니다. 그건,

  • 사용 ForceCommandsshd_config
  • 암호없이 로그인 및 사용 command="..."에를.ssh/authorized_keys
  • 사용자의 쉘을 사용자가 할 수있는 것을 제한하는 것으로 변경

노트:

  • command="..." 하나의 키에만 적용되므로 암호 또는 다른 키를 사용하는 사용자의 SSH 로그인을 제한하지 않습니다.
  • 포트 포워딩 등을 제한하고 싶을 수도 있습니다 (포트 포워딩, x11 포워딩, 에이전트 포워딩 및 pty 할당은 내가 들었던 것입니다)
    • AllowTcpForwardingsshd_config
    • no-port-forwarding.ssh/authorized_keys
  • 다른 데몬 (FTP와 같은)이 실행중인 경우, 사용자가 해당 데몬을 허용하지 않는지 확인해야합니다 (일부 데몬은 사용자의 쉘을 기반으로이 결정을 내림)
  • 사용자의 쉘을 원하는 작업을 수행하는 스크립트로 변경할 수 있습니다. 그것은 인수없이 실행되거나script -c 'command-the-user-wanted-to-run'
  • 모두 ForceCommandcommand="..."사용자의 쉘이 예로 설정되어있는 경우가 일을하지 않도록, 사용자의 쉘을 통해 명령어를 실행합니다. /bin/false또는/sbin/nologin

면책 조항 : 나는 결코 문제에 대해 전문가 .profile가 아니기 때문에 그 물건이 안전하지 않다고 말할 수 는 있지만, 내가 모르는 다른 방법과 함께 어떤 "gotcha"가 없다고 약속 할 수는 없습니다. 약. 그들은 내가 아는 한 안전하지만 인터넷에서 처음 잘못한 사람은 아닙니다.


1
적어도 in으로 ForceCommand비밀번호를 사용하지 않는 로그인 은 이전에 우회되었지만 서버의 버그로 인한 같습니다. 악의적 인 사용자에 대해 안전하고이를 우회하는 사용자는 심각한 취약점으로 간주됩니다. SSH 서버에서 (따라서 우선 순위 수정) 지적했듯이 설계 상 우회 할 수 있습니다 . 보안 기능으로 간주되지 않기 때문에 사용자가이를 우회하는 것은 셸 개발자의 관점에서 완벽하게 가능합니다. command=authorized_keys.profile
cpast

1
@ cpast : 예, 포트 포워딩과 같은 더 많은 기능이 있다고 생각했습니다. ssh가 포트 포워딩 ForceCommand을 허용하고 액세스를 제한 하는 데 사용되었다는 것을 모르고 로컬에서만 연결을 수신하고 인증을 수행하지 않는 데몬이있는 경우 ssh 사용자는 여전히 데몬에 액세스 할 수 있습니다. 내가 나열한 기능은 다음과 같습니다. git 호스팅 솔루션은 일반적으로 비활성화되어 있으며 맨 페이지에서 "악한 모양"을 추가로 보지 못했지만 공식적인 "이것은 ForceCommand안전하게 사용하는 방법 "입니다.
Aleksi Torhamo

분명히 ~/.profile사용자는 편집 가능하고 보안에는 도움이되지 않지만 cpast의 기술을 의미있게 만들 수 /etc/profile있습니까? UID를 확인하여 올바른 사용자로 제한 할 수 있습니다.
병아리

1
@ 병아리 : 아니오, 똑같은 문제가 있습니다. 문제는 파일을 사용자가 편집 할 수 있다는 것이 아닙니다. 문제는 두 파일을 모두 무시할 수 있다는 것입니다. 파일은 로그인 쉘에만 사용되며, 방금 말하면 ssh user@hostssh에 명령을 실행하도록 명령하면 나타납니다. ssh user@host command-더 이상 로그인 쉘을 얻지 못하고 파일이 전혀 건드리지 않습니다. 따라서 ssh에 추가 인수를 지정하여 누군가 파일로 작성하려고 시도한 모든 제한 사항을 무시할 수 있습니다.
Aleksi Torhamo

2
@chicks : 또한, 나는 당신이 cpast를 언급했다는 것을 깨달았습니다. cpast의 대답의 방법은 사용하지 않는 .profile것이 사용 sshd_config및 안전합니다. 그는 .profile당신이 이것을하지 않아야하는 방법으로 언급 합니다.
Aleksi Torhamo

1

SSH를 활성화하고 전체 및 사용자 / 그룹별로 SFTP를 비활성화 할 수 있습니다.

SSH를 통해 일부 자식 리포지토리에 액세스하고 싶기 때문에 개인적으로 필요하며 필요하지 않은 시스템을 비활성화하고 싶습니다. 이 경우 SFTP가 필요하지 않습니다.

전 세계적으로

몇 가지 방법으로 모든 사용자에 대해 SFTP를 비활성화 할 수 있습니다.

누락 된 서브 시스템

SSH에서 사용하는 SFTP 데몬은 Subsystem키워드를 통해 구성 할 수 있습니다 . 로부터 sshd_config(5)수동 :

Subsystem
        Configures an external subsystem (e.g. file transfer daemon).
        Arguments should be a subsystem name and a command (with optional
        arguments) to execute upon subsystem request.

        The command sftp-server(8) implements the “sftp” file transfer
        subsystem.

        Alternately the name “internal-sftp” implements an in-process
        “sftp” server.  This may simplify configurations using
        ChrootDirectory to force a different filesystem root on clients.

        By default no subsystems are defined.

마지막 줄은 "sftp"에 대한 서브 시스템을 정의 할 수 없을 것임을 제안합니다.

거짓 거짓말

SSH에서 사용하는 SFTP 데몬을 사용할 수없는 것으로 설정하여 SFTP를 비활성화 할 수도 있습니다. 예를 들어, "sftp"서브 시스템을 /bin/false다음 과 같이 구성하십시오 .

Subsystem sftp /bin/false

SFTP를 통해 로그인을 시도하면 SSH 데몬이 "sftp 데몬"을 생성하려고 시도합니다 /bin/false. /bin/false프로그램은 하나의 일을, 그 오류 코드를 반환하는 것입니다. SFTP 연결 시도가 효과적으로 거부되었습니다.

사용자 / 그룹당

사용자, 그룹 또는 몇 가지 다른 기준별로 SFTP를 비활성화 할 수도 있습니다.

사용자에게 일반 쉘 프롬프트를 표시하려는 경우에는 작동하지 않습니다. 쉘 액세스 권한이 있으면 대부분의 항목을 우회 할 수 있으므로 의미가 없습니다. 특정 프로그램에 대한 액세스 권한 만 부여하려는 경우에만 작동합니다.

어울리는

사용자 세트와 일치시키기 위해 Match키워드를 사용하여 SSH를 구성 할 수 있습니다 . 로부터 sshd_config(5)수동 :

Match
        ...

        The arguments to Match are one or more criteria-pattern pairs or the
        single token All which matches all criteria.  The available criteria
        are User, Group, Host, LocalAddress, LocalPort, and Address.  The
        match patterns may consist of single entries or comma-separated
        lists and may use the wildcard and negation operators described in
        the PATTERNS section of ssh_config(5).

        ...

몇 가지 예 :

  • Match User eva "eva"사용자와 일치
  • Match User stephen,maria "stephen"및 "maria"사용자와 일치
  • Match Group wheel,adams,simpsons "바퀴", "아담", "심슨"그룹과 일치

자세한 정보가 필요하면 sshd_config(5)매뉴얼에 로드가 있습니다.

강제 명령

일반적으로 SSH를 통해 연결하면 사용자의 로그인 쉘이 표시되지만 특정 명령을 강제 실행하도록 SSH를 구성 할 수 있습니다. SFTP를 포함한 모든 SSH 연결에 대해 명령이 강제 실행되므로 원하는 명령을 강제 실행하는 옵션이있을 수 있습니다.

ForceCommand키워드 로 강제 명령을 구성 할 수 있습니다 . 로부터 sshd_config(5)수동 :

ForceCommand
        Forces the execution of the command specified by ForceCommand,
        ignoring any command supplied by the client and ~/.ssh/rc if
        present.  The command is invoked by using the user's login shell
        with the -c option.  This applies to shell, command, or subsystem
        execution.  It is most useful inside a Match block.  The command
        originally supplied by the client is available in the
        SSH_ORIGINAL_COMMAND environment variable.  Specifying a command of
        “internal-sftp” will force the use of an in-process sftp server that
        requires no support files when used with ChrootDirectory.  The
        default is “none”.

따라서 사용하려는 제한 명령을 강제로 실행할 수 있습니다 ForceCommand <your command>. 예를 들면 다음과 같습니다.

Match User kim
        ForceCommand echo 'successful login man, congrats'

git 액세스 권한을 부여하려는 경우 사용자에게만 액세스 권한이 필요합니다 git-shell. 다음은 일부 보안 옵션과 함께 내 git 사용자에 대해 SFTP를 비활성화하는 섹션입니다.

Match Group git

        # have to do this instead of setting the login shell to `git-shell`,
        # to disable SFTP
        ForceCommand /usr/bin/git-shell -c "$SSH_ORIGINAL_COMMAND"

        # disable stuff we don't need
        AllowAgentForwarding no
        AllowTcpForwarding no
        AllowStreamLocalForwarding no
        PermitOpen none
        PermitTunnel no
        PermitTTY no
        X11Forwarding no

필자의 경우 특정 권한이 부여 된 키 (예 : sshd_config 파일 변경 없음)에 대해 MySQL 액세스 (SFTP 액세스 및 SSH 터미널 창 모두 허용 안 함) 만 허용하려고했습니다. 특정 키에 대해 다음 ~ / .ssh / authorized_keys 옵션을 사용하여이 작업을 수행했습니다. command = "/ usr / bin / echo 'MySQL 액세스 만 허용됩니다.'", no-pty, no-X11-forwarding, permitopen = "127.0.0.1:3306"
Martin_ATS
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.