클러스터 전송 암호화 구성
Enterprise 플랜에서 사용 가능
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/bin
에 pre_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 시스템 콘솔을 열고 고가용성 섹션에서 각 노드가 성공적으로 보고되는지 확인하십시오.