チュートリアル: 単一ノードGitLabインスタンスをインストールしてセキュリティを設定する
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab Self-Managed
このチュートリアルでは、最大20 RPSまたは1,000ユーザーに対応できる単一ノードのGitLabインスタンスを安全にインストールおよび設定する方法を学びます。
単一ノードのGitLabインスタンスをインストールし、安全に設定するには:
はじめる前
- ドメイン名、および正しいDNSの設定。
- 次の最小仕様を持つDebianベースのサーバー:
- 8 vCPU
- 7.2 GBメモリ
- すべてのリポジトリに十分なハードドライブ容量。ストレージ要件の詳細については、こちらをご覧ください。
サーバーを保護する
GitLabをインストールする前に、サーバーをより安全に設定することから始めます。
ファイアウォールを設定する
ポート22(SSH)、80(HTTP)、および443(HTTPS)を開く必要があります。これは、クラウドプロバイダーのコンソールを使用するか、サーバーレベルで行うことができます。
この例では、ufwを使用してファイアウォールを設定します。すべてのポートへのアクセスを拒否し、ポート80および443を許可し、最後にポート22へのアクセスをレート制限します。ufwは、過去30秒間に6回以上接続を試みたIPアドレスからの接続を拒否できます。
ufwをインストールします:sudo apt install ufwufwサービスを有効にして開始します:sudo systemctl enable --now ufw必要なポートを除くすべてのポートを拒否します:
sudo ufw default deny sudo ufw allow http sudo ufw allow https sudo ufw limit ssh/tcp最後に、設定を有効にします。以下は、パッケージを初めてインストールするときに1回だけ実行する必要があります。プロンプトが表示されたらyes(
y)と答えます:sudo ufw enableルールが存在することを確認します:
$ sudo ufw status Status: active To Action From -- ------ ---- 80/tcp ALLOW Anywhere 443 ALLOW Anywhere 22/tcp LIMIT Anywhere 80/tcp (v6) ALLOW Anywhere (v6) 443 (v6) ALLOW Anywhere (v6) 22/tcp (v6) LIMIT Anywhere (v6)
SSHサーバーを設定する
サーバーのセキュリティをさらに強化するには、SSHが公開鍵認証を受け入れるように設定し、潜在的なセキュリティリスクとなる一部の機能を無効にします。
/etc/ssh/sshd_configをエディタで開き、以下が存在することを確認します: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ファイルを保存し、SSHサーバーを再起動します:
sudo systemctl restart sshSSHの再起動が失敗した場合は、
/etc/ssh/sshd_configに重複するエントリがないことを確認してください。
承認されたユーザーのみがGitアクセスにSSHを使用していることを確認する
次に、SSH経由でGit操作を実行できる有効なGitLabアカウントを持っていない限り、ユーザーがSSHを使用してプロジェクトをプルできないようにします。
承認されたユーザーのみがGitアクセスにSSHを使用していることを確認するには:
お使いの
/etc/ssh/sshd_configファイルに以下を追加します:# Ensure only authorized users are using Git AcceptEnv GIT_PROTOCOLファイルを保存し、SSHサーバーを再起動します:
sudo systemctl restart ssh
いくつかのカーネル調整を行う
カーネル調整は攻撃の脅威を完全に排除するものではありませんが、セキュリティのレイヤーをさらに追加します。
お使いのエディタで
/etc/sysctl.dの下に新しいファイル(例:/etc/sysctl.d/99-gitlab-hardening.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次回のサーバー再起動時に、値は自動的に読み込まれます。すぐに読み込むには:
sudo sysctl --system
お疲れ様でした。サーバーを保護する手順が完了しました!これでGitLabをインストールする準備ができました。
GitLabをインストールする
サーバーの設定が完了したので、GitLabをインストールします:
必要な依存関係をインストールして設定します:
sudo apt update sudo apt install -y curl openssh-server ca-certificates perl localesシステム言語を設定します:
/etc/locale.genをエディタで開き、en_US.UTF-8がコメントアウトされていないことを確認します。言語を再生成します:
sudo locale-gen
GitLabパッケージリポジトリを追加し、パッケージをインストールします:
curl --location "https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh" | sudo bashスクリプトの内容を見るには、https://packages.gitlab.com/gitlab/gitlab-ee/installにアクセスしてください。
GitLabパッケージをインストールします。
GITLAB_ROOT_PASSWORDで強力なパスワードを指定し、EXTERNAL_URLをご自身のものに置き換えます。URLにhttpsを含めることを忘れないでください。Let’s Encrypt証明書が発行されます。sudo GITLAB_ROOT_PASSWORD="strong password" EXTERNAL_URL="https://gitlab.example.com" apt install gitlab-eeLet’s Encrypt証明書の詳細、または独自の証明書を使用する方法については、TLSでGitLabを設定する方法をお読みください。
設定したパスワードが適用されなかった場合は、ルートアカウントパスワードのリセットについて詳細をお読みください。
数分後、GitLabがインストールされます。
EXTERNAL_URLで設定したURLを使用してサインインします。rootをユーザー名として使用し、GITLAB_ROOT_PASSWORDで設定したパスワードを使用します。
さあ、GitLabを設定しましょう!
GitLabを設定する
GitLabには、いくつかの適切なデフォルトの設定オプションが付属しています。このセクションでは、より多くの機能を追加し、GitLabをより安全にするためにそれらを変更します。
オプションの一部では管理者エリアUIを使用し、他のオプションではGitLabの設定ファイルである/etc/gitlab/gitlab.rbを編集します。
NGINXを設定する
NGINXは、GitLabインスタンスにアクセスするために使用されるWebインターフェースを提供するために使用されます。NGINXをより安全に設定する方法の詳細については、NGINXの強化についてお読みください。
メールを設定する
次に、メールサービスをセットアップして設定します。メールは、新規登録の確認、パスワードのリセット、GitLabアクティビティの通知に重要です。
SMTPを設定する
このチュートリアルでは、SMTPサーバーをセットアップし、Mailgun SMTPプロバイダーを使用します。
まず、ログイン認証情報を含む暗号化されたファイルを作成し、次にLinuxパッケージ用にSMTPを設定します:
SMTPサーバーの認証情報を含むYAMLファイル(例:
smtp.yaml)を作成します。SMTPパスワードには、RubyまたはYAMLで使用される文字列デリミタ(例:
')を含めないでください。設定の処理中に予期せぬ動作が発生するのを避けるためです。user_name: '<SMTP user>' password: '<SMTP password>'ファイルを暗号化します:
cat smtp.yaml | sudo gitlab-rake gitlab:smtp:secret:writeデフォルトでは、暗号化されたファイルは
/var/opt/gitlab/gitlab-rails/shared/encrypted_settings/smtp.yaml.encの下に保存されます。YAMLファイルを削除します:
rm -f smtp.yaml/etc/gitlab/gitlab.rbを編集し、残りのSMTP設定を行います。gitlab_rails['smtp_user_name']とgitlab_rails['smtp_password']は、すでに暗号化されたものとして設定済みのため、存在しないことを確認してください。gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = "smtp.mailgun.org" # or smtp.eu.mailgun.org gitlab_rails['smtp_port'] = 587 gitlab_rails['smtp_authentication'] = "plain" gitlab_rails['smtp_enable_starttls_auto'] = true gitlab_rails['smtp_domain'] = "<mailgun domain>"ファイルを保存して、GitLabを再設定します:
sudo gitlab-ctl reconfigure
これでメールを送信できるようになります。設定が機能したことをテストするには:
Railsコンソールを入力します:
sudo gitlab-rails consoleコンソールプロンプトで次のコマンドを実行して、GitLabからテストメールを送信します:
Notify.test_email('<email_address>', 'Message Subject', 'Message Body').deliver_now
メールを送信できない場合は、SMTPトラブルシューティングセクションを参照してください。
ロックされたアカウントのメール確認を必須にする
アカウントのメール確認は、GitLabアカウントのセキュリティにさらなるレイヤーを提供します。特定の条件(たとえば、24時間以内に3回以上サインインに失敗した場合)が満たされると、アカウントがロックされます。
前提条件:
- 管理者である必要があります。
ロックされたアカウントのメール確認を必須にするには:
- 右上隅で、管理者を選択します。
- 設定 > 一般を選択します。
- サインインの制限を展開します。
- ロックしたアカウントのメール認証チェックボックスを選択します。
- 変更の保存を選択します。
詳細については、アカウントメール確認についてお読みください。
S/MIMEで送信メールに署名する
GitLabから送信される通知メールは、セキュリティを向上させるためにS/MIMEで署名できます。
単一のキーと証明書ファイルのペアを提供する必要があります:
- 両方のファイルはPEMエンコードされている必要があります。
- キーファイルは、GitLabがユーザーの介入なしにそれを読み取りできるように、暗号化されていない状態である必要があります。
- RSAキーのみがサポートされています。
- (オプション)各署名に含める認証局(CA)証明書のバンドル(PEMエンコード済み)を提供できます。これは通常、中間CAです。
CAから証明書を購入してください。
/etc/gitlab/gitlab.rbを編集し、ファイルパスを調整します:gitlab_rails['gitlab_email_smime_enabled'] = true gitlab_rails['gitlab_email_smime_key_file'] = '/etc/gitlab/ssl/gitlab_smime.key' gitlab_rails['gitlab_email_smime_cert_file'] = '/etc/gitlab/ssl/gitlab_smime.crt'ファイルを保存して、GitLabを再設定します:
sudo gitlab-ctl reconfigure
詳細については、S/MIMEで送信メールに署名する方法についてお読みください。
次の手順
このチュートリアルでは、サーバーをより安全に設定する方法、GitLabをインストールする方法、および一部のセキュリティ標準を満たすようにGitLabを設定する方法を学びました。GitLabを保護するために実行できるその他の手順には、次のようなものがあります:
- サインアップを無効にする。デフォルトでは、新しいGitLabインスタンスではサインアップがデフォルトで有効になっています。GitLabインスタンスを公開する予定がない場合は、サインアップを無効にする必要があります。
- 特定のメールドメインを使用したサインアップの許可または拒否。
- 新規ユーザーのパスワード長の最小制限を設定する。
- すべてのユーザーに対して2要素認証を強制する。
GitLabインスタンスの強化以外にも、GitLabが提供するCI/CD機能を活用するために独自のRunnerを設定したり、インスタンスを適切にバックアップしたりするなど、設定できることはたくさんあります。
インストール後の手順について詳しくお読みいただけます。