웹사이트 검색

포트 노킹을 사용하여 Ubuntu의 공격자로부터 SSH 데몬을 숨기는 방법


상태: 더 이상 사용되지 않음

이 문서에서는 더 이상 지원되지 않는 Ubuntu 버전에 대해 설명합니다. 현재 Ubuntu 12.04를 실행하는 서버를 운영 중인 경우 지원되는 Ubuntu 버전으로 업그레이드하거나 마이그레이션하는 것이 좋습니다.

  • Ubuntu 14.04로 업그레이드합니다.
  • Ubuntu 14.04에서 Ubuntu 16.04로 업그레이드
  • 서버 데이터를 지원되는 버전으로 마이그레이션

이유:

대신 참조:

소개

정의에 따라 서버는 서비스를 제공하고 사용자가 응용 프로그램과 리소스에 액세스할 수 있도록 하는 수단으로 구현됩니다. 그러나 인터넷에 연결된 모든 컴퓨터는 필연적으로 보안 취약점을 이용하려는 악의적인 사용자와 스크립트의 표적이 됩니다.

방화벽이 존재하고 서비스에서 사용하지 않는 포트에 대한 액세스를 차단하는 데 사용해야 하지만 액세스를 원하지만 모든 사람에게 노출하고 싶지 않은 서비스에 대해 수행할 작업에 대한 질문이 여전히 있습니다. 필요할 때 액세스하고 싶지만 그 외에는 차단하고 싶습니다.

포트 노킹은 컴퓨터에서 실행 중인 서비스를 가리는 한 가지 방법입니다. 특정 네트워크 트래픽 시퀀스를 통해 포트를 열도록 요청할 때까지 방화벽이 서비스를 보호할 수 있습니다.

이 가이드에서는 knockd 패키지를 사용하여 Ubuntu 12.04 VPS에서 SSH 데몬을 숨기는 방법으로 포트 노킹을 구현하는 방법에 대해 설명합니다.

참고: 이 자습서에서는 IPv4 보안을 다룹니다. Linux에서 IPv6 보안은 IPv4와 별도로 유지됩니다. 예를 들어 "iptables\는 IPv4 주소에 대한 방화벽 규칙만 유지하지만 IPv6 네트워크 주소에 대한 방화벽 규칙을 유지하는 데 사용할 수 있는 "ip6tables\라는 IPv6 대응 항목이 있습니다.

VPS가 IPv6용으로 구성된 경우 적절한 도구를 사용하여 IPv4 및 IPv6 네트워크 인터페이스를 모두 보호해야 합니다. IPv6 도구에 대한 자세한 내용은 이 가이드를 참조하십시오. Linux VPS에서 IPv6을 사용하도록 도구를 구성하는 방법

포트 노킹은 어떻게 작동합니까?

포트 노킹은 연결 시도에 대한 방화벽 로그 또는 패킷 캡처 인터페이스를 감시하도록 서비스를 구성하여 작동합니다. 미리 정의된 연결 시도(또는 "노크\)의 특정 시퀀스가 수행되면 서비스는 방화벽 규칙을 수정하여 특정 포트에서 연결을 엽니다.

이렇게 하면 서비스를 실제로 사용할 계획이 될 때까지 서비스를 숨길 수 있습니다. 이것은 항상 연결을 사용할 수 있기를 원하기 때문에 HTTP 서버와 같은 것에 실용적이지 않습니다. 그러나 SSH와 같이 알려지고 합법적인 사용자만 사용하도록 되어 있는 서비스에는 유용합니다.

노킹 시퀀스는 임의로 복잡할 수 있지만 그 자체가 일반적으로 유일한 보안 조치 세트는 아닙니다. 일반적으로 서비스 자체의 보안 및 인증 방법은 올바른 시퀀스를 발행하는 사용자에게 노출됩니다. 이러한 방식으로 포트 노킹은 사용자가 일반 인증을 받기 위해 거쳐야 하는 추가 계층을 추가합니다.

더 도움이 되는 것은 노크 시도에 대한 피드백이 제공되지 않는다는 것입니다. 침입자 스캐닝은 일반적인 모든 포트가 닫힌 것을 볼 수 있으며 노킹 시퀀스를 시도하는 경우 포트가 열려 있는지 확인하기 위해 각 시도 사이를 확인해야 합니다. 이것은 종종 공격자를 설득하거나 금지하기에 충분합니다.

우리의 목적을 위해 Ubuntu 12.04와 함께 제공되는 iptables 방화벽을 사용하고 knockd라는 데몬을 설치하여 포트 노킹 기능을 제공할 것입니다.

대부분의 트래픽을 차단하도록 IPTables 구성

실제 포트 노킹에 도달하기 전에 기본 방화벽을 구성해야 합니다. 우리는 대부분의 것을 잠그고 싶습니다.

기본적으로 Ubuntu는 iptables가 설치된 상태로 제공됩니다. 그러나 기본 규칙이 없으므로 모든 트래픽이 허용됩니다. 자신만의 규칙 세트를 설계하려면 여기에서 iptables로 방화벽을 설정하는 방법을 배울 수 있습니다.

우리의 목적을 위해 해당 가이드의 대부분의 규칙을 사용합니다.

로컬 컴퓨터에서 트래픽을 허용하여 시작합니다. 이것은 서버가 생성하고 자신에게 보내는 트래픽을 수락하는 것을 의미합니다. 이렇게 하면 서비스가 차단되지 않고 서로 통신할 수 있습니다.

sudo iptables -A INPUT -i lo -j ACCEPT

이것은 "INPUT\ 체인에 규칙을 추가합니다. 이 체인은 서버로 들어오는 모든 연결을 처리합니다. 이 규칙은 내부 통신에 사용되는 로컬 루프백 인터페이스인 "lo\ 네트워크 인터페이스에서 모든 트래픽을 수락하도록 iptables에 지시합니다.

다음으로 다음을 입력하여 설정된 모든 연결 및 설정된 연결과 관련된 트래픽을 허용하는지 확인합니다.

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

이 규칙은 이미 설정된 연결과 관련된 트래픽을 수락하도록 iptables에 지시합니다. 연결 차단을 시작하면 현재 SSH 세션이 끊어지는 것을 원하지 않기 때문에 이것은 중요합니다.

다음으로 지속적이고 전 세계적으로 소비 가능한 서비스를 허용하고 싶을 것입니다. 이것이 의미하는 바는 항상 실행되고 표시되어야 하는 서비스에 대한 규칙을 추가한다는 것입니다. 예를 들어 표준 포트 80에서 제공되는 웹 사이트가 있는 경우 해당 트래픽을 항상 허용하려고 합니다.

포트 노커를 사용하여 열 서비스에 대한 규칙을 iptables에 추가하지 마십시오. 대신 노킹 데몬을 사용하여 규칙 세트를 동적으로 수정합니다. 자습서에서는 초기 iptables 구성에 SSH 서버를 추가하지 않습니다.

이 구문을 사용하여 고유한 규칙을 설정합니다.

<예비>

이 시점에서 우리는 연결을 끊는 것이 아니라 수락하는 규칙만 추가했습니다. 우리는 여전히 모든 것을 받아들이고 있으며 특정 종류의 트래픽에 대해 명시적이었습니다.

이제 특별히 허용하지 않은 모든 항목을 삭제합니다. 이 규칙을 추가합니다.

sudo iptables -A INPUT -j DROP

위의 규칙에 의해 처리되지 않은 모든 트래픽은 삭제됩니다. 다음을 입력하여 규칙을 볼 수 있습니다.

sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -j DROP

보시다시피 새 SSH 연결을 수락하는 규칙이 아직 없습니다.

이 시점에서 연결이 끊어지면 오른쪽 상단 모서리에 있는 "콘솔 액세스\ 버튼을 클릭하여 제어판을 통해 서버에 액세스해야 합니다.

이것은 직접 로그인 역할을 하며 SSH를 사용하지 않으므로 규칙의 영향을 받지 않습니다.

iptables 규칙을 설정했으면 iptables-persistent를 사용하여 영구적으로 만듭니다. 다음을 입력하여 설치하십시오.

sudo apt-get install iptables-persistent

그런 다음 다음을 입력하여 서비스를 시작합니다.

sudo service iptables-persistent start

Knockd 서비스 설치

우리가 사용할 포트 노킹 인식 서비스는 knockd입니다. 간단히 다음을 입력하여 설치할 수 있습니다.

sudo apt-get install knockd

이렇게 하면 유틸리티가 설치되지만 기본적으로 서비스는 시작되지 않습니다.

이는 데몬이 중요한 트래픽을 즉시 차단하지 않도록 하기 위한 안전 조치입니다. 이 서비스를 구성하고 명시적으로 활성화해야 합니다.

포트 노킹을 사용하도록 Knockd 구성

서비스를 구성하려면 구성 파일을 편집해야 합니다. 루트 권한으로 이 파일을 엽니다.

sudo nano /etc/knockd.conf

다음과 같은 파일이 표시됩니다.

[options]
        UseSyslog

[openSSH]
        sequence    = 7000,8000,9000
        seq_timeout = 5
        command     = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
        tcpflags    = syn

[closeSSH]
        sequence    = 9000,8000,7000
        seq_timeout = 5
        command     = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
        tcpflags    = syn

즉시 knockd가 어떻게 작동하는지에 대한 몇 가지 중요한 정보를 볼 수 있어야 합니다. 또한 구성이 너무 복잡하지 않다는 것을 인식해야 합니다.

"options\ 섹션에서 UseSyslog라는 지시문을 볼 수 있습니다. 이것은 일반 syslog 방법을 사용하여 정보를 기록해야 한다는 것을 knockd에 알려줍니다. 이렇게 하면 /var/log/에 로그가 삽입됩니다. 메시지.

다른 로그 파일을 지정하려면 다음 옵션을 대신 사용하면 됩니다.

<예비>

아래에는 두 개의 섹션이 있습니다. 이 섹션의 이름은 무엇이든 될 수 있습니다. 각각 단일 이벤트와 일치하는 규칙 세트를 그룹화하는 데 사용됩니다.

예를 들어 파일에는 SSH 포트를 여는 섹션과 다시 닫는 섹션이 있습니다.

노킹 패턴을 설정하는 매개변수는 다음과 같습니다.

<예비>

즉, 동일한 IP가 포트 7000에서 연결을 요청한 다음 바로 포트 8000, 마지막으로 포트 9000에서 연결을 요청하면 이 규칙 집합이 일치합니다.

이 세트의 다른 두 매개변수도 활동이 일치하는지 여부를 제어합니다.

seq_timeout = 5
tcpflags = syn

첫 번째 옵션은 시퀀스가 완료되어야 하는 시간을 지정합니다.

두 번째는 유효한 것으로 간주되기 위해 tcp 패킷에 있어야 하는 플래그를 지정합니다. 여기에서 볼 수 있는 syn 값은 일반적으로 SSH와 같은 프로그램에 의해 백그라운드에서 생성된 패킷과 원하는 패킷을 구별하는 데 사용됩니다.

마지막으로 다음 명령이 표시됩니다.

command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT

이것을 iptables 규칙으로 인식해야 합니다. "openSSH\ 섹션 레이블에서 알 수 있듯이 이 섹션은 올바른 순서에 도달했을 때 SSH 연결을 위한 포트를 엽니다.

그러나 iptables 구성 중에 주의를 기울이면 이 새로운 규칙이 -A 옵션을 사용하여 이 규칙을 INPUT 체인의 끝에 추가하는 것을 볼 수 있습니다. . 이렇게 하면 남아 있는 모든 연결을 끊는 규칙 뒤에 이 규칙이 배치됩니다.

이 상황을 해결하려면 이 명령을 수정해야 합니다. 명령을 규칙으로 교체하여 목록 맨 위에 새 규칙을 삽입하십시오. -I 옵션을 사용하고 위치를 규칙 1로 참조하여 이를 수행합니다.

command = /sbin/iptables -I INPUT 1 -s %IP% -p tcp --dport 22 -j ACCEPT

이 변경으로 노크 한 사용자의 SSH 연결을 수락하기 위해 INPUT 체인의 상단에 새로운 규칙이 추가됩니다. 규칙의 %IP% 부분은 허용 가능한 노크를 만든 IP 주소로 대체됩니다.

두 번째 SSH 섹션은 거의 동일한 작업을 수행하지만 다른 시퀀스를 사용하고 SSH에 대한 연결을 연 iptables에서 규칙을 제거합니다. 우리는 우리가 연 간격을 좁히기 위해 이 시퀀스를 칠 수 있습니다.

실제로는 이 두 섹션의 시퀀스를 본질적으로 무작위로 변경해야 합니다. 기본 시퀀스를 유지하면 포트 노킹이 설정하는 모든 보안이 효과적으로 제거됩니다.

추가로 구성하기 전에 현재 설정을 테스트해 보겠습니다. 파일을 저장하고 닫습니다.

Knockd 서비스 구현

유효한 규칙 세트를 갖도록 knockd를 구성했으므로 데몬을 구현하여 테스트할 수 있습니다. 구성이 유효하더라도 이 시점에서 각 노킹 섹션의 포트 시퀀스를 변경하지 않는 한 안전하지 않다는 점을 명심하십시오.

다른 파일을 편집하여 서비스를 활성화해야 합니다. 루트 권한으로 이 파일을 엽니다.

sudo nano /etc/default/knockd

서비스를 시작하려면 START_KNOCKD 옵션을 "1\로 변경해야 합니다.

<예비>

파일을 저장하고 닫습니다.

이제 다음을 입력하여 서비스를 시작할 수 있습니다.

sudo service knockd start

이렇게 하면 데몬이 시작되고 포트 시퀀스를 노크하여 iptables 규칙 세트를 변경할 수 있습니다.

포트 노킹 테스트

이제 구성한 포트 노킹 시퀀스를 사용하여 iptables 규칙을 수정하는 기능을 테스트해야 합니다.

새 터미널 창에서 도구를 사용하여 이러한 포트를 요청할 수 있습니다. 문제가 발생할 경우를 대비하여 다른 세션을 열어 두는 것이 가장 좋습니다. 다시 말하지만, 실수로 잠긴 경우 제어판의 드롭릿 페이지 오른쪽 상단에 있는 "콘솔 액세스\ 버튼을 사용하세요.

우리는 두드리기 위해 다양한 도구를 사용할 수 있습니다. 일부 대중적인 선택은 netcat, nmap 및 적절하게는 knock이라고 하는 특별히 설계된 클라이언트입니다.

대부분의 Linux 배포판과 OS X에 기본적으로 설치되어 있기 때문에 이 예제에서는 nmap을 사용합니다.

노크하기 전에 SSH 포트가 실제로 현재 닫혀 있는지 확인합시다. 일반적으로 서버에 연결하는 데 사용하는 명령을 입력합니다.

<예비>

서버로부터 응답이 없어야 하고 SSH 클라이언트가 시간 초과되어야 합니다. 현재 SSH 데몬이 iptables에 의해 차단되어 있기 때문입니다. SSH 시도가 자동으로 시간 초과되지 않으면 ctrl-C를 입력하여 SSH 시도를 종료합니다.

설정된 시퀀스 시간 초과 매개변수로 인해 실제로 올바른 시퀀스에 도달하는 데 걸리는 시간은 매우 제한적입니다. 작은 인라인 bash 스크립트를 사용하여 이러한 포트를 빠르게 노크합니다.

로컬 컴퓨터에서 다음과 같은 명령을 입력합니다.

<예비>

명령에서 세 개의 숫자를 시퀀스에 대해 선택한 숫자로 조정하여 SSH 포트를 엽니다. 서버 주소를 반영하도록 server_ip_address를 변경합니다.

나열된 모든 포트에서 순차적으로 nmap을 호출합니다.

완료되면 정기적으로 SSH에 로그인할 수 있습니다.

<예비>

구성한 다른 시퀀스를 두드려 포트를 다시 닫을 수 있습니다.

<예비>

Knock 유틸리티를 사용한 포트 노킹

두드리는 더 간단한 방법은 knockd 제작자가 제공하는 knock 유틸리티를 사용하는 것입니다. 이것은 knockd 패키지에 포함되어 있으므로 서버에서 했던 것처럼 클라이언트 시스템에 설치할 수 있습니다.

sudo apt-get install knockd

또한 "다운로드\ 섹션 아래의 프로젝트 웹 사이트에서 노크 클라이언트를 얻을 수 있습니다. 사용 가능한 기본 OS X 및 Windows 클라이언트(심지어 iOS 및 Android 클라이언트도 있음)가 있습니다.

노크 클라이언트가 설치되면 다음 구문을 사용하여 시퀀스를 쉽게 수행할 수 있습니다.

<예비>

예를 들어 다음을 입력하여 SSH 포트를 열 수 있습니다.

<예비>

이것은 언급된 다른 방법보다 훨씬 빠릅니다.

다음을 입력하여 포트를 닫을 수 있습니다.

<예비>

연결을 자동으로 종료하도록 Knockd 구성

이제 포트 노킹 데몬이 올바르게 작동하고 있음을 확인했으므로 일부 구성 세부 정보를 보다 강력하게 변경해 보겠습니다.

구성 파일을 다시 엽니다.

sudo nano /etc/knockd.conf

우리는 SSH 일치를 하나의 규칙으로 압축하기 위해 명령 시간 초과를 설정하는 knockd의 기능을 활용할 것입니다. 이것은 작업이 끝난 후에 SSH 포트를 닫기 위해 노크할 필요가 없다는 것을 의미합니다.

"openSSH” 및 "closeSSH” 섹션을 주석 처리하거나 삭제할 수 있습니다. 간단히 "SSH\라고 부르는 단일 섹션으로 대체할 것입니다.

[options]
    UseSyslog

[SSH]

이 새 섹션에서 다른 섹션에서와 마찬가지로 시퀀스, tcpflags 및 시퀀스 시간 초과를 설정합니다. SSH 포트를 여는 데 사용한 명령도 포함합니다.

<예비>

[SSH]

고유한 포트 시퀀스를 선택합니다. 보시다시피 이 예에서는 4개의 포트를 사용합니다. seq_timeout 매개변수에 지정된 시간 프레임에 모두 노크할 수 있는 한 포트 수를 늘릴 수 있습니다.

start_command 매개변수는 다른 예에서 사용한 command 매개변수와 동일합니다. 우리는 단순히 우리가 수행하는 작업에 대해 더 자세히 설명하기 위해 이 변형을 사용하기로 했습니다.

그런 다음 포트를 닫는 데 도움이 되는 몇 가지 새 매개 변수를 추가합니다.

<예비>

[SSH]

cmd_timeoutstop_command 변수에 포함된 명령을 실행하기 전에 knockd가 대기하는 시간(초)입니다.

그 결과 올바른 시퀀스가 사용되면 데몬이 SSH 포트를 엽니다. 그런 다음 10초 동안 기다린 다음 포트를 다시 닫습니다.

파일을 저장하고 닫습니다.

데몬을 다시 시작하여 새 규칙을 구현합니다.

sudo service knockd restart

이 포트 노킹 규칙을 사용하여 지정된 시간 내에 쉽게 연결할 수 있습니다. 예를 들어 다음 명령을 사용하여 서버에 쉽게 연결할 수 있습니다.

<예비>

방화벽에 만든 구멍은 10초 후에 닫힙니다.

결론

포트 노킹은 때로 모호함을 통한 보안(서비스를 실제로 보호하는 대신 숨김)으로 비하하는 어조로 이야기되지만 무작위 공격에 대한 추가 보호 계층을 추가하는 좋은 방법입니다.

최상의 결과를 위해 사용할 수 있는 기본 도구를 사용하여 항상 서비스를 보호해야 합니다. 그러나 이러한 방법 앞에 포트 노킹 체계와 같은 것을 추가하면 서비스에서 경험하는 무차별 암호 대입 공격 또는 침입 시도의 수를 크게 줄일 수 있습니다.

저스틴 엘링우드