SSH 액세스를 계속 허용하면서 SCP를 방지 할 수 있습니까?


13

Solaris 및 Linux 서버 및 OpenSSH를 사용하면 "ssh"를 사용하여 쉘 액세스를 허용하면서 "scp"를 사용하여 파일을 복사하지 못하게 할 수 있습니까?

'ssh $ server "cat file"'형식 파일 액세스를 방지하기가 훨씬 어렵다는 것을 알고 있지만 초보자 용 "scp"중지에 대해 알아야합니다.

실패하면 서버 측의 모든 SCP 액세스를 확실하게 기록 할 수있는 방법이 syslog있습니까?


ssh를 닫고 싶지만 scp가 아니라면 이것을 사용할 수 있습니다 : sublimation.org/scponly/wiki/index.php/Main_Page 너무 나쁘다 :-\

나는 같은 질문을하지만 다른 이유로. 제 경우에는 서버에서 SFTPD와 SCPD를 끄고 싶습니다. 이유는 파일 전송을 허용하지만 사용자가 복사 노드를 통해 전송하는 것을 좋아하기 때문입니다. 이는 링크의로드를 분리하는 방식 때문입니다. 따라서이 루프에 따르면 SFTPD를 끄는 것이 쉽지만, 올바르게 이해하면 SCPD를 끄는 것이 거의 불가능합니까?

답변:


12

/etc/ssh/sshd_config다음과 같이 보이도록 편집 할 수 있습니다 .

ForceCommand           /bin/sh
PermitOpen             0.0.0.0
AllowTcpForwarding     no
PermitTunnel           no
# Subsystem sftp       /usr/lib/openssh/sftp-server
PermitUserEnvironment  no

대신 사용자가 무엇을 사용할지 결정합니다. 액세스 할 수있는 명령이 몇 개 밖에 없으면 일반 ssh쉘을 호출 할 수있는 기능을 제거합니다 .

AllowUsers             root
PermitRootLogin        forced-commands-only

PermitUserEnvironment  no

AllowTcpForwarding     no
PermitTunnel           no

# Subsystem sftp       /usr/lib/openssh/sftp-server
Subsystem smb-reload   /usr/bin/smbcontrol smbd reload-config
Subsystem status       /opt/local/bin/status.sh

ssh root@example -s smb-reload

만약 당신이 정말로 정상적인 쉘을 실행할 수 있어야한다면, 당신이 정말로 기대할 수있는 것은 느리게하고 더 어렵게 만드는 것입니다.


8

다른 사람들이 지적했듯이 scp를 차단 할 수 없습니다 (음, 당신은 할 수 있습니다 : rm /usr/bin/scp 있지만 실제로는 어디에도 가지 않습니다).

가장 좋은 방법은 사용자의 쉘을 제한된 쉘 (rbash)로 변경 한 다음에 만 특정 명령을 실행하는 것입니다.

파일을 읽을 수 있으면 화면에서 복사 / 붙여 넣기 할 수 있습니다. 이진 파일? xxd / uuencode / mmencode 모두이 문제를 해결합니다.

활동을 추적하는 데 도움이되도록 프로세스 계정을 사용하는 것이 좋습니다.


프로세스 회계는 약간 도움이되지만 과거 프로세스 회계는 실제로 쓸모가 없었습니다 (예 : 명령 실행의 기본 이름 만 로깅). 실제로 유용한 프로세스 회계를 통해 현대의 ​​성공에 대해 듣고 싶습니다.
carlito

1
패치 된 제한된 쉘을 사용하여 모든 명령을 파이프 어딘가에 기록하는 것은 어떻습니까? 중앙 집중식 .bash_history 종류의 아이디어.
MikeyB 2016 년

실제로 서버 측에서는 / usr / lib / openssh / sftp-server를 삭제해야하지만 sshd에는 sftp 서버가 내장되어 있다고 생각합니다.
브래드 길버트

@Brad : 클라이언트가 지정한 모든 명령은 여전히 ​​셸을 통해 실행됩니다. 따라서 sftp-server가 기본 PATH에 있지 않은 경우 (그렇지 않은 경우) 쉘을 제한된 것으로 변경하는 것만으로는 쉘을 비활성화 할 수 있으므로 바이너리를 삭제할 필요가 없습니다.
MikeyB

6

문자 그대로 무한한 추가 파일 전송 메커니즘을 허용하는 경우 "scp"를 중지해도 아무런 효과가 없습니다. scp를 허용하지 않지만 파일 복사의 다른 메커니즘을 허용하는 것은 감사 자에게 거짓말을하는 방법입니다. 감사 자들은 종종 거짓말을 요구합니다. 일반적으로 감사인이 관리자와 함께 가짜 수정을 수행하여 "scp 파일 전송 명령이 비활성화되어 scp를 사용하여 서버에서 파일을 복사 할 수 없도록"하는 것과 같은 내용을 알 수 있습니다.

이제 합리적인 로깅 메커니즘이 좋을 것입니다. 어쩌면 감사는 마침내 Linux에서 작동합니다. 어쩌면 Solaris가 마침내 일부 메커니즘을 추가했거나 dtrace를 안전하게 사용할 수 있습니다. 파일에 액세스 할 때마다 OS가 기록되도록하는 것이 합리적입니다. 물론 "읽기"와 "복사"사이에는 차이가 없습니다. 그러나 이것은 감사자를 만족시키고 시스템에 상당한 보안을 제공 할 수 있습니다. 로그가 너무 시끄러워서 데이터가 쓸모 없거나 엄청나게 짧은 감사 추적을 유지해야 할 수도 있습니다. (예를 들어 모든 read ()를 기록 할 수는 없습니다. 놀라운 일을하는 하나의 응용 프로그램은 모든 open ()을 기록하는 것을 재앙으로 만들 수 있습니다).


5

어떤 SSH가 필요한지에 따라 패킷 크기가 1400 바이트보다 큰 경우 IPTables를 사용하여 세션을 종료하여 사소한 파일을 달성 할 수 있습니다. 이것은 대화식 ssh가 대부분 작동한다는 것을 의미하지만, 1500 MTP를 가정 할 때 scp가 1499 바이트보다 큰 파일의 경우 1500 바이트 패킷을 보내려고하면 연결이 종료됩니다.

이것은 또한 당신이 언급 한 "catting"공격을 막을 것입니다.

불행히도 이것은 화면에 1400 자 이상을 그려야하거나 긴 파일을 만들거나 긴 디렉토리 목록을 작성해야하는 경우 텍스트 편집기로 일부 파일을 편집하는 데 문제가있을 수 있음을 의미합니다.

가장 간단한 경우이 작업을 수행하는 명령은 다음과 같습니다

iptables -I OUTPUT -p tcp --dport 22 -m length --length 1400:0xffff -j DROP

패킷 길이 검사를 ipt_recent와 결합하여이 작업을 더 잘 수행 할 수 있으므로 설정된 시간 내에 1400 바이트보다 큰 제한된 수의 패킷 (예 : 5 초당 8 패킷)을 허용 할 수 있습니다. 이렇게하면 최대 12k의 패킷이 미끄러질 수 있습니다. 파일 등을 편집하는 데 필요한 대화 형 기능을 제공 할 수도 있습니다. 물론 패킷 수를 조정할 수도 있습니다.

이것은 다음과 같이 보일 수 있습니다

iptables -I OUTPUT -p tcp --dport 22 -m length --length 1400:0xffff \
         -m recent --name noscp --rdest --set 
iptables -I OUTPUT -p tcp --dport 22 -m length --length 1400:0xffff \
         -m recent --name noscp --rdest --update --seconds 5 --hitcount 8 \
         -j REJECT --reject-with tcp-reset

위의 규칙 예는와 같은 scp 업로드 만 방지 scp myfile.data remote.host:~합니다. 와 같은 scp 다운로드를 추가로 방지하려면 scp remote.host:~/myfile.data /local/path위 규칙을 반복하되 대신 --dport로 교체하십시오 --sport.

단서가있는 해커는 자신의 컴퓨터에서 MTU를 1400 미만으로 설정 (또는 강제로 mtu 또는 이와 유사한 방법)하여 이러한 제한을 해결할 수 있습니다. 또한 특정 사용자로 제한 할 수는 없지만 iptables 행을 적절하게 수정하여 IP로 제한 할 수 있습니다 !!

건배, 데이비드 고



1

번호 scpssh동일한 포트에서 작동하고 동일한 프로토콜을 사용합니다. ssh세션 을 열면 같은 옵션을 사용하여 후속 scp 통화와 연결을 공유 할 수도 있습니다 ControlMaster.

사람들이 머신에서 특정 파일을 복사하지 못하게하려면 머신에 어떤 종류의 쉘 액세스도 제공해서는 안됩니다.


그렇습니다. 명백한 대답은 시스템을 잠그고 액세스 권한을 부여하지 않는 것입니다. 그러나 실제로 회사에는 ssh 액세스를 심각하게 제한하고 강력한 RBAC 시스템을 갖추고 있음에도 불구하고 서버 및 / 또는 로그 시도에서 파일이 복사되는 것을 방지해야한다고 말하는 감사원이 있습니다.

2
@Jason : 그런 다음 파일 액세스를 기록해야합니다. scp를 비활성화하더라도 ssh server 'cat / path / to / file'> copy?
derobert 2016 년

0

대화식 ssh를 비활성화하고 scp를 허용하기 위해 'scponly'를 셸로 사용하는 방법이 있지만, 반대로 작동하는 기존 내용은 알지 못합니다.

scponly shell 해킹을 탐색하여 그 반대로 할 수 있습니다.


0

약간의 인터넷 검색 후에는 실제로 불가능합니다.

이 토론을 확인하십시오 : http://www.mydatabasesupport.com/forums/unix-admin/387261-how-restrict-ssh-users-block-scp-sftp.html


이 링크는 죽었습니다.
rox0r

0

가치있는 것은 상용 제품인 CryptoAuditorMITM 연결 및 심층 패킷 검사를 사용하여 SSH를 통한 파일 전송을 제어 할 수 있다고 주장합니다 . 분명히 복사 / 붙여 넣기, uuencode / decode, FISH 등 으로부터 해결책이 안전하지 않습니다 . SSH 연결의 양쪽 끝에 설치할 에이전트 소프트웨어가 없으며 구성 할 포털 / 프록시가 없습니다.

나는 제품을 사용하지 않았으므로 YMMV.


0

시스템을 완전히 쓸모 없게 만드는 많은 시스템 유틸리티를 제거하지 않고 파일 전송을 차단하는 것은 불가능합니다. 파일 내용을 stdout에 표시 할 수있는 모든 것과 stdin을 stdout에 쓸 수있는 모든 것을 제거해야하며, 남은 것들을 모두 제거 할 때까지 셸 액세스를 허용 할 필요가 없습니다. 조금도.

대신 로깅 대안에 중점을 둘 것입니다.

거의 모든 배포판에 포함되어 있으며 그렇지 않은 프로그램에는 설치하기 쉬운 "스크립트"라는 프로그램이 있습니다. 선택적으로 타이밍 데이터와 함께 쉘의 모든 입력 및 출력을 기록하는 세션 로거이므로 사용자가 어깨를 보면서 보았을 때처럼 재생하고 볼 수 있습니다. (어쨌든 95 %는 ncurses가 관련되어있을 때 때로는 출력을 보풀하지만 자주는 아닙니다.)

매뉴얼 페이지에는 시스템의 로그인 쉘로 설정하기위한 지침이 포함되어 있습니다. 사용자가 로그를 삭제할 수없는 위치에 로그가 있는지 확인하십시오 (chattr을 통해 설정 가능한 추가 전용 파일 시스템 속성이이 기능에 유용 할 수 있습니다. ACL 또는 스크립트를 비활성화 할 수 있음)

이렇게해도 사용자가 시스템에서 파일을 복사하지 못하게 할 수는 없지만 사용자가 언제 어떤 작업을 수행했는지 검토 할 수 있습니다. 우회하는 것이 불가능하지는 않지만 우회는 거의 확실하게 로그에서 끝나므로 누군가가 정확히 무엇을 숨길 수 있더라도 적어도 누군가가 좋지 않다는 것을 알 것입니다.


0

서버에서 openssh-clients (또는 이와 동등한)를 제거 할 수 있다고 생각합니다.

scp 클라이언트는 데이터를 복사 할 때 서버에서 scp를 호출하므로 서버에서 scp를 제거하면 괜찮을 것입니다.

$ scp bla server:/tmp/
...
debug1: Sending environment.
debug1: Sending env LC_ALL = en_US.utf8
debug1: Sending env LANG = en_US.utf8
debug1: Sending env XMODIFIERS = @im=ibus
debug1: Sending env LANGUAGE = en_US.utf8
debug1: Sending command: scp -v -t /tmp/
bash: scp: command not found
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: client_input_channel_req: channel 0 rtype eow@openssh.com reply 0
lost connection
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.