ハードニング - オペレーティングシステムの推奨事項

一般的なハードニングのガイドラインは、ハードニングに関する主な文書に概説されています。

全体的なセキュリティを高めるために、基盤となるオペレーションシステムを設定することができます。GitLabインスタンスのような管理された環境では、追加の手順が必要になります。FedRAMPはそのようなデプロイの例です。

SSH設定

SSHクライアントの設定

クライアントからのアクセス(GitLabインスタンスへのアクセス、あるいは基盤となるオペレーティングシステムへのアクセス)のために、SSHキーの生成に関する推奨事項をいくつか示します。最初のものは典型的なSSHキーです:

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

FIPS準拠のSSHキーは、次のようにします:

ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -C "RSA FIPS-compliant Key"

SSHサーバー設定

オペレーティングシステムレベルで、(通常は OpenSSH を使って) SSH アクセスを許可している場合、sshd_config ファイルの設定オプションの例を示します (正確な場所はオペレーティングシステムによって異なるかもしれませんが、通常は/etc/ssh/sshd_config です):

#
# Example sshd config file. This supports public key authentication and
# turns off several potential security risk areas
#
PubkeyAuthentication yes
PasswordAuthentication yes
UsePAM yes
UseDNS no
AllowTcpForwarding no
X11Forwarding no
PrintMotd no
PermitTunnel no
# Allow client to pass locale environment variables
AcceptEnv LANG LC_*
# override default of no subsystems
Subsystem       sftp    /usr/lib/openssh/sftp-server
# Protocol adjustments, these would be needed/recommended in a FIPS or
# FedRAMP deployment, and use only strong and proven algorithm choices
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 のみを推奨し、ポート80443へのリダイレクトにのみ使用します。

FedRAMPのような真に強化された、あるいは隔離された環境の場合は、ファイアウォールのルールを調整して、アクセスするネットワーク以外のすべてのポートを制限する必要があります。例えば、IPアドレスが192.168.1.2 で、作成者がすべて192.168.1.0/24 にいる場合、他のファイアウォールでアクセスが制限されていても、ポート80443 へのアクセスを192.168.1.0/24 だけに制限します(安全上の制限として)。

理想的には、セルフマネージドインスタンスをインストールする場合、管理者とインストーラにアクセスを制限した状態でインストールを開始する前にファイアウォールルールを実装し、インスタンスがインストールされ、適切に堅牢化された後にユーザーのIPアドレスの範囲を追加します。

iptables またはufw の使用は、ホストごとにポート80443 アクセスを実装し、強制するために許容されます。そうでなければ、GCP Google Compute または AWS Security Groups を介してクラウドベースのファイアウォールルールを使用して、これを強制する必要があります。その他のポートはすべてブロックするか、少なくとも特定の範囲に制限してください。ポートの詳細については、パッケージのデフォルトを参照してください。

ファイアウォールの追加

外部からのアクセス(Sidekiqなど)を必要とする様々なサービスが有効になっている可能性があり、ネットワークアクセスを開放する必要があります。可能であれば、GitLabの特定のノードやサブネットワークにこれらの追加サービスを制限してください。

カーネルの調整

カーネルの調整は、/etc/sysctl.conf 、または/etc/sysctl.d/ にあるファイルのいずれかを編集することで行うことができます。カーネルの調整によって攻撃の脅威が完全になくなるわけではありませんが、セキュリティのレイヤーが追加されます。以下のノートでは、カーネル調整の利点について説明します。

## Kernel tweaks for sysctl.conf ##
##
## The following help mitigate out of bounds, null pointer dereference, heap and
## buffer overflow bugs, use-after-free etc from being exploited. It does not 100%
## fix the issues, but seriously hampers exploitation.
##
# Default is 65536, 4096 helps mitigate memory issues used in exploitation
vm.mmap_min_addr=4096
# Default is 0, randomize virtual address space in memory, makes vuln exploitation
# harder
kernel.randomize_va_space=2
# Restrict kernel pointer access (for example, cat /proc/kallsyms) for exploit assistance
kernel.kptr_restrict=2
# Restrict verbose kernel errors in dmesg
kernel.dmesg_restrict=1
# Restrict eBPF
kernel.unprivileged_bpf_disabled=1
net.core.bpf_jit_harden=2
# Prevent common use-after-free exploits
vm.unprivileged_userfaultfd=0

## Networking tweaks ##
##
## Prevent common attacks at the IP stack layer
##
# Prevent SYNFLOOD denial of service attacks
net.ipv4.tcp_syncookies=1
# Prevent time wait assassination attacks
net.ipv4.tcp_rfc1337=1
# IP spoofing/source routing protection
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 redirection protection
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