Hardening - 운영 체제 권장사항
일반 강화 지침은 주요 강화 문서에 개요로 설명되어 있습니다.
전반적인 보안성을 향상시키기 위해 기본 운영 체제를 구성할 수 있습니다. 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
# 클라이언트가 로컬 환경 변수를 전달할 수 있게 허용
AcceptEnv LANG LC_*
# 기본적으로 사용하지 않는 하위 시스템 무시
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 포트 80
및 443
만 열어야 합니다. 기본적으로 5050
포트는 컨테이너 레지스트리에 대한 원격 액세스를 허용합니다. 그러나 강화된 환경에서는 이를 대부분 다른 호스트에서 사용하며, 일부 환경에서는 아예 열지 않습니다. 따라서 권장 사항은 80
및 443
포트만을 사용하고, 80
포트는 꼭 443
로 리디렉션해야 합니다.
FedRAMP와 같은 실제로 강화된 또는 격리된 환경에서는 방화벽 규칙을 조정하여 해당 네트워크에서만 액세스할 수 있도록 모든 포트를 제한해야 합니다. 예를 들어, IP 주소가 192.168.1.2
이고 모든 인가된 클라이언트가 또한 192.168.1.0/24
에 있을 경우, 포트 80
및 443
에 대한 액세스를 192.168.1.0/24
로만 제한해야 합니다(안전상의 이유로), 다른 방화벽으로 다른 곳에서 액세스가 제한되어 있더라도입니다.
이상적으로는 Self-managed 인스턴스를 설치하기 전에 방화벽 규칙을 적용하여 관리자 및 설치자만 액세스할 수 있도록 제한하고, 인스턴스가 설치되어 적절하게 강화된 후에 사용자의 추가 범위를 추가하도록 해야 합니다.
iptables
또는 ufw
를 사용하여 호스트 단위로 포트 80
및 443
액세스를 실행하거나, GCP Google Compute 또는 AWS 보안 그룹을 통한 클라우드 기반 방화벽 규칙 사용이 이를 강요해야 합니다. 다른 모든 포트는 차단하거나 특정 범위로 제한되어야 합니다. 포트에 대한 자세한 정보는 패키지 기본값을 참조하십시오.
방화벽 추가
외부 액세스가 필요한 다양한 서비스(예: Sidekiq)가 활성화될 수 있습니다. 이러한 유형의 서비스를 특정 IP 주소 또는 특정 Class 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
## 네트워킹 조정 ##
##
## IP 스택 계층에서 일반적인 공격을 방지합니다
##
# SYNFLOOD 거부 서비스 공격 방지
net.ipv4.tcp_syncookies=1
# 타임웨이트 암살 공격 방지
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