클러스터 전송 암호화 구성

plans-img Enterprise 플랜에서 사용 가능

deployment-img self-hosted 배포판

이 기능은 레거시 Mattermost Enterprise Edition E20에서도 사용할 수 있습니다.

Mattermost은 SSH 터널링을 사용하여 배포된 클러스터 내에서 전송된 메시지를 암호화할 수 있습니다. 이 안내서는 이 솔루션을 Ubuntu 18.04에서 배포하는 방법을 안내하지만, 어떤 리눅스 운영 체제에도 적용할 수 있습니다.

이 문서는 세 개의 노드 클러스터의 구성에 대해 설명하지만, 해당 개수로 제한되는 것은 아닙니다.

필수 구성 요소

  • 배포된 각 노드 간의 SSH 포트 화이트리스트.

  • 각 노드에서 활성화된 ufw/iptables.

  • 각 노드의 루트/sudo 사용자 액세스가 구성되어 있어야 함.

  • 구성된 Mattermost 클러스터.

  • 전용 서비스 사용자로 실행 중인 Mattermost.

  • 클러스터 노드에서 Mattermost 서비스가 중지되어 있어야 함.

Note

응용 프로그램 수준에서의 지원은 현재 개발 중이며, 사용 가능해지면이 문서는 사라질 것입니다.

예시 환경

이 시나리오에서 우리의 환경에는 다음 호스트명/IP 매핑이 있는 세 개의 애플리케이션 노드가 있습니다:

  • transport-encryption-mattermost1: 10.10.250.146

  • transport-encryption-mattermost2: 10.10.250.231

  • transport-encryption-mattermost3: 10.10.250.165

준비 사항

  • 각 Mattermost 서버에 root 또는 sudo 사용자로 연결합니다.

  • 내부 통신에 사용되는 각 클러스터 구성원의 IP를 메모합니다.

  • 각 클러스터 노드의 /etc/ssh/sshd_config 에서 AllowTcpForwarding 가 활성화되어 있는지 확인합니다.

SSH 인증

각 노드에서 서비스 계정을 위해 SSH 키페어를 생성합니다. 우리의 시나리오에서는 이것을 mattermost 라고 합니다:

$ sudo -u mattermost ssh-keygen -t rsa
  공개/개인 rsa 키페어를 생성합니다.
  키를 저장할 파일 이름을 입력하십시오(/home/mattermost/.ssh/id_rsa):
  암호를 입력하십시오(비밀번호를 사용하지 않으려면 비워 두십시오):
  다시 한번 동일한 암호를 입력하십시오:
  식별자는 /home/mattermost/.ssh/id_rsa에 저장되었습니다.
  공개 키는 /home/mattermost/.ssh/id_rsa.pub에 저장되었습니다.
  키 지문은 다음과 같습니다:
  SHA256:마스킹 처리된 mattermost@transport-encryption-mattermost1

SSH 키 자체의 위치는 회사 정책에서 다른 저장 위치의 사용을 요구하는 경우에 무시할 수 있습니다.

다음으로, 각 노드의 SSH 공개 키를 클러스터 다른 노드의 authorized_keys 파일에 추가합니다. 이를 위해 2번 노드 및 3번 노드의 /home/mattermost/.ssh/id_rsa.pub 내용을 1번 노드의 /home/mattermost/.ssh/authorized_keys 에 추가합니다.

이 단계를 클러스터의 각 노드에 대해 반복합니다. 결과적으로 각 노드는 클러스터의 다른 노드에 SSH 연결을 설정할 수 있어야 합니다.

Note

이 서비스 계정은 이미 Mattermost systemd 서비스에 사용되는 서비스 계정과 별개 일 수 있습니다. 이 서비스 계정은 포트 포워딩을 사용하여 SSH 터널을 생성할 수 있지만, 추가적인 권한이 필요하지는 않습니다.

ufw 구성

다음으로, 다른 구성원 노드에서 각각의 다른 회원 노드로부터 SSH 액세스를 허용합니다. 예를 들어:

  • mattermost1은 mattermost2 및 mattermost3로부터 허용

  • mattermost2는 mattermost1 및 mattermost3로부터 허용

  • mattermost3은 mattermost1 및 mattermost2로부터 허용

이를 위해 방화벽에 예외를 추가합니다. mattermost1 의 명령어는 다음과 같이 보입니다:

$ sudo ufw allow from 10.10.250.231/32 to any port ssh
Rule added
$ sudo ufw allow from 10.10.250.165/32 to any port ssh
Rule added
$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       10.10.250.10
8065/tcp                   ALLOW       Anywhere
22/tcp                     ALLOW       10.10.250.231
22/tcp                     ALLOW       10.10.250.165

다른 노드에 대해 동일한 단계를 반복하되 IP를 해당 구성원 노드의 IP로 대체합니다. 자신의 노드를 제외한 각 구성원 노드에 대해 이를 수행합니다.

그 다음, /etc/ufw/after.rules 를 열고 파일의 맨 아래에 다음 블록을 추가합니다:

*nat
:POSTROUTING ACCEPT [0:0]
:PREROUTING ACCEPT [0:0]

-A OUTPUT -p tcp -d 10.10.250.231 --dport 8075 -j DNAT --to-destination 127.0.0.1:18075
-A OUTPUT -p tcp -d 10.10.250.231 --dport 8074 -j DNAT --to-destination 127.0.0.1:18074
-A OUTPUT -p tcp -d 10.10.250.165 --dport 8075 -j DNAT --to-destination 127.0.0.1:28075
-A OUTPUT -p tcp -d 10.10.250.165 --dport 8074 -j DNAT --to-destination 127.0.0.1:28074

COMMIT

두 줄은 항상 하나의 노드에 속하므로, 4개 노드가 있는 배포에서:

-A OUTPUT -p tcp -d ip_node_2 --dport 8075 -j DNAT --to-destination 127.0.0.1:18075
-A OUTPUT -p tcp -d ip_node_2 --dport 8074 -j DNAT --to-destination 127.0.0.1:18074
-A OUTPUT -p tcp -d ip_node_3 --dport 8075 -j DNAT --to-destination 127.0.0.1:28075
-A OUTPUT -p tcp -d ip_node_3 --dport 8074 -j DNAT --to-destination 127.0.0.1:28074
-A OUTPUT -p tcp -d ip_node_4 --dport 8075 -j DNAT --to-destination 127.0.0.1:38075
-A OUTPUT -p tcp -d ip_node_4 --dport 8074 -j DNAT --to-destination 127.0.0.1:38074

오른쪽에있는 포트는 고유해야 하므로, 6개 노드로 클러스터를 구성하는 경우 1에서 5까지 사용하세요. 클러스터가 더 큰 경우 추가 포트를 사용해야 합니다.

운영 체제가 다음 명령을 사용하여 IP 전달을 활성화했는지 확인합니다:

$ sysctl -w net.ipv4.ip_forward=1

그 후에 ufw 규칙을 다시로드하고 iptable 규칙이 성공적으로 작성되었는지 확인하세요:

$ iptables -t nat -L
사슬 PREROUTING (정책 ACCEPT)
대상     프로토콜 소스               목적지

사슬 INPUT (정책 ACCEPT)
대상     프로토콜 소스               목적지

사슬 OUTPUT (정책 ACCEPT)
대상     프로토콜 소스               목적지
DNAT       tcp  --  아무데나             10.10.250.231        tcp dpt:8075 to:127.0.0.1:18075
DNAT       tcp  --  아무데나             10.10.250.231        tcp dpt:8074 to:127.0.0.1:18074
DNAT       tcp  --  아무데나             10.10.250.165        tcp dpt:8075 to:127.0.0.1:28075
DNAT       tcp  --  아무데나             10.10.250.165        tcp dpt:8074 to:127.0.0.1:28074

각 클러스터 노드에 대해 이러한 단계를 반복합니다. 이 섹션의 끝에 다음이 구성되어야합니다:

  • 각 클러스터 노드에서 다른 노드로의 방화벽에서 SSH 액세스가 활성화됩니다.

  • 포트 8074 및 8075에 대해 노드당 2개의 iptables 규칙.

  • IP 전달이 활성화됩니다.

SSH 구성

다음 단계로, Mattermost 서비스 시작시에 SSH 터널이 생성되도록 확인하십시오. 이를 위해 mattermost1/opt/mattermost/binpre_start.sh 라는 파일을 만듭니다.

#!/bin/bash
ssh -N -f -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -L 18075:10.10.250.231:8075 10.10.250.231 || true
ssh -N -f -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -L 18074:10.10.250.231:8074 10.10.250.231 || true
ssh -N -f -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -L 28075:10.10.250.165:8075 10.10.250.165 || true
ssh -N -f -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -L 28074:10.10.250.165:8074 10.10.250.165 || true

Note

  • SSH 연결에서의 오류는 터널이 이미 활성화 된 경우에 대비해 무시합니다. 그렇지 않으면 Mattermost 서버가 시작에 실패합니다.

  • 버전 업그레이드의 경우 이 스크립트를 반드시 백업해 두십시오.

그런 다음 셸 스크립트에 실행 가능한 비트를 설정합니다.

$ chmod +x /opt/mattermost/bin/pre_start.sh

그 후, Mattermost의 systemd 유닛 파일을 열고 Type=Notify 을 검색합니다. 이후, Mattermost 자체가 시작되기 전에 실행될 ExecStartPre 스크립트를 입력합니다.

[Service]
Type=notify
ExecStartPre=/opt/mattermost/bin/pre_start.sh

다음에 systemd 데몬을 다시로드하십시오.

$ systemctl daemon-reload

각 구성원 노드에서 동일한 단계를 반복하고 환경에 따라 노드 IP와 항목 수를 조정하십시오.

클러스터 시작

각 노드가 구성된 후, 각 클러스터에서 서비스를 다시 시작하고 다음 명령을 사용하여 실행 중인지 확인하십시오.

root@transport-encryption-mattermost1:/opt/mattermost/bin# systemctl start mattermost
root@transport-encryption-mattermost1:/opt/mattermost/bin# systemctl status mattermost.service
● mattermost.service - Mattermost
   Loaded: loaded (/lib/systemd/system/mattermost.service; static; vendor preset: enabled)
   Active: active (running) since Fri 2019-10-04 19:44:20 UTC; 5min ago
  Process: 16734 ExecStartPre=/opt/mattermost/bin/pre_start.sh (code=exited, status=0/SUCCESS)

다음으로 Mattermost 시스템 콘솔을 열고 고가용성 섹션에서 각 노드가 성공적으로 보고되는지 확인하십시오.