하드닝 - 운영 체제 권장 사항

일반적인 하드닝 지침은 기본 하드닝 문서에 개요되어 있습니다.

기본적으로 운영 체제를 구성하여 전반적인 보안을 강화할 수 있습니다. Self-Managed GitLab 인스턴스와 같은 제어 환경에서는 추가 단계가 필요하며, 특정 배포에 대해 종종 필요합니다. FedRAMP는 그러한 배포의 한 예입니다.

SSH 구성

SSH 클라이언트 구성

클라이언트 접근(일반적으로 GitLab 인스턴스 또는 기본 운영 체제로)의 경우 SSH 키 생성에 대한 몇 가지 권장 사항이 있습니다. 첫 번째는 전형적인 SSH 키입니다.

ssh-keygen -a 64 -t ed25519 -f ~/.ssh/id_ed25519 -C "ED25519 키"

FIPS(연방 정보 처리 표준) 호환 SSH 키의 경우 다음을 사용하십시오.

ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -C "RSA FIPS 호환 키"

SSH 서버 구성

운영 체제 수준에서 SSH 액세스를 허용하는 경우(일반적으로 OpenSSH를 통해), sshd_config 파일의 구성 옵션 예제는 다음과 같습니다(운영 체제에 따라 정확한 위치는 다를 수 있지만 일반적으로 /etc/ssh/sshd_config에 있습니다).

#
# 예시 sshd 구성 파일. 이것은 공개 키 인증을 지원하며
# 몇 가지 잠재적인 보안 위험 영역을 해제합니다
#
PubkeyAuthentication yes
PasswordAuthentication yes
UsePAM yes
UseDNS no
AllowTcpForwarding no
X11Forwarding no
PrintMotd no
PermitTunnel no
PermitRootLogin no

# 클라이언트가 로캘 환경 변수를 전달할 수 있도록 함
AcceptEnv LANG LC_*

# 기본 대기 시간 120초를 60초로 변경
LoginGraceTime 60

# 하위시스템의 기본값 무시
Subsystem       sftp    /usr/lib/openssh/sftp-server

# 프로토콜 조정, FIPS 또는 FedRAMP 배포에서 필요하며
# 강력하고 검증된 알고리즘 선택만 사용
Protocol 2
Ciphers aes128-ctr,aes192-ctr,aes256-ctr
HostKeyAlgorithms ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521
KexAlgorithms ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521
Macs hmac-sha2-256,hmac-sha2-512

방화벽 규칙

방화벽 규칙의 경우, 기본 사용을 위해 TCP 포트 80443만 열어두어야 합니다. 기본적으로 5050은 컨테이너 레지스트리에 대한 원격 액세스를 허용하지만, 하드닝된 환경에서는 이를 다른 호스트에서 운영하며 일부 환경에서는 전혀 열리지 않을 것입니다. 따라서 권장 사항은 80443 포트만을 사용하며, 포트 80은 반드시 443으로 리디렉션되어야 합니다.

FedRAMP와 같은 진정한 하드닝되거나 격리된 환경의 경우, 방화벽 규칙을 수정하여 IP 주소가 액세스하는 네트워크를 제외한 모든 포트에 대해 제한해야 합니다. 예를 들어, IP 주소가 192.168.1.2이고 모든 인가된 클라이언트가 192.168.1.0/24에 있다면, 포트 80443에 대한 액세스를 192.168.1.0/24로만 제한해야 합니다(안전을 위한 제한으로), 다른 방화벽에서 다른 곳에서 액세스가 이미 제한된 경우에도 해당합니다.

이상적으로, Self-Managed 인스턴스를 설치하는 경우, 설치가 시작되기 전에 방화벽 규칙을 구현하여 관리자 및 설치자의 액세스가 제한되고, 인스턴스가 올바르게 하드닝된 후에 사용자의 추가적인 IP 주소 범위를 추가할 수 있어야 합니다.

iptables 또는 ufw를 사용하여 호스트별로 포트 80443에 대한 액세스를 구현하고 강요하는 것은 허용됩니다. 그렇지 않으면 GCP Google Compute나 AWS 보안 그룹을 통해 클라우드 기반 방화벽 규칙을 사용하여 구현해야 합니다. 다른 모든 포트는 차단되거나 특정 범위로만 제한되어야 합니다. 포트에 대한 자세한 정보는 패키지 기본값을 참조하세요.

방화벽 추가

외부 액세스가 필요한 다양한 서비스가 활성화될 수 있으며(예: Sidekiq), 이러한 유형의 서비스를 특정 IP 주소 또는 특정 클래스 C로 제한해야 합니다. 가능한 한 추가 조치로, GitLab의 특정 노드나 서브네트워크에 이러한 추가 서비스를 제한해야 합니다.

커널 조정

커널 조정은 /etc/sysctl.conf를 편집하거나 /etc/sysctl.d/의 파일 중 하나를 수정하여 수행될 수 있습니다. 커널 조정은 공격의 위협을 완전히 제거하지는 않지만 추가적인 보안 층을 추가합니다. 다음은 이러한 조정의 장점을 설명하는 노트입니다.

## sysctl.conf를 위한 커널 조정 ##
##
## 다음은 경계를 벗어난, 널 포인터 역참조, 힙 및
## 버퍼 오버플로우 버그, 사용 후 메모리 해제 등이
## 악용되는 것을 막는데 도움이 됩니다. 이것이 모든
## 문제를 100% 수리하는 것은 아니지만, 심각하게 방해합니다.
##
# 기본값은 65536이며, 악용에 사용되는 메모리 문제를 완화하는 데 도움이 됩니다
vm.mmap_min_addr=4096
# 기본값은 0이며, 가상 주소 공간을 무작위로 배치하여 취약점 악용을
# 어렵게 만듭니다
kernel.randomize_va_space=2
# 악용 지원을 위한 커널 포인터 액세스 제한 (예: cat /proc/kallsyms)
kernel.kptr_restrict=2
# dmesg의 상세 커널 오류 제한
kernel.dmesg_restrict=1
# eBPF 제한
kernel.unprivileged_bpf_disabled=1
net.core.bpf_jit_harden=2
# 일반적인 사용 후 메모리 해제 악용 방지
vm.unprivileged_userfaultfd=0
# CVE-2024-1086을 방지하기 위해 일반 사용자가 네임스페이스를 만드는 것을 제한
kernel.unprivileged_userns_clone=0

## 네트워킹 조정 ##
##
## IP 스택 레이어에서 일반적인 공격을 방지합니다
##
# SYNFLOOD 거절 서비스 공격 방지
net.ipv4.tcp_syncookies=1
# TIME_WAIT 기다림 악용 방지
net.ipv4.tcp_rfc1337=1
# IP 스푸핑/출발 경로 보호
net.ipv4.conf.all.rp_filter=1
net.ipv4.conf.default.rp_filter=1
net.ipv6.conf.all.accept_ra=0
net.ipv6.conf.default.accept_ra=0
net.ipv4.conf.all.accept_source_route=0
net.ipv4.conf.default.accept_source_route=0
net.ipv6.conf.all.accept_source_route=0
net.ipv6.conf.default.accept_source_route=0
# IP 리다이렉션 보호
net.ipv4.conf.all.accept_redirects=0
net.ipv4.conf.default.accept_redirects=0
net.ipv4.conf.all.secure_redirects=0
net.ipv4.conf.default.secure_redirects=0
net.ipv6.conf.all.accept_redirects=0
net.ipv6.conf.default.accept_redirects=0
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.default.send_redirects=0