チュートリアルシングルノードのGitLabインスタンスのインストールとセキュリティ
このチュートリアルでは、最大1,000ユーザーを収容できるシングルノードのGitLabインスタンスをインストールしてセキュアに設定する方法を学びます。
シングルノードの GitLab インスタンスをインストールし、セキュアに設定するには:
前提条件
- ドメイン名とDNSの正しいセットアップ。
- 以下の最低スペックを持つ Debian ベースのサーバ:
- 8 vCPU
- 7.2GBメモリ
- すべてのリポジトリに十分なハードドライブの空き容量。ストレージ要件について詳しくはこちらをご覧ください。
サーバーのセキュリティ
GitLabをインストールする前に、サーバーをもう少しセキュアに設定することから始めましょう。
ファイアウォールの設定
ポート 22(SSH) 、80(HTTP)、443(HTTPS)を開く必要があります。これは、クラウドプロバイダーのコンソールを使うか、サーバーレベルで行うことができます。
この例では、ufw
を使ってファイアウォールを設定します。すべてのポートへのアクセスを拒否し、ポート 80 と 443 を許可し、最後にポート 22 へのアクセスをレート制限します。ufw
は、過去 30 秒間に 6 回以上の接続を開始しようとした IP アドレスからの接続を拒否できます。
-
ufw
をインストールします:sudo apt install ufw
-
ufw
サービスを有効にして起動します:sudo systemctl enable --now ufw
-
必要なポート以外を拒否します:
sudo ufw default deny sudo ufw allow http sudo ufw allow https sudo ufw limit ssh/tcp
-
最後に、設定をアクティブにします。以下は、パッケージを最初にインストールするときに一度だけ実行する必要があります。プロンプトが表示されたら、「はい」(
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 ssh
SSHの再起動に失敗した場合は、
/etc/ssh/sshd_config
に重複したエントリがないか確認してください。
作成者だけがSSHでGitにアクセスできるようにします。
次に、SSH 経由で Git オペレーションを実行できる有効な GitLab アカウントを持っていない限り、ユーザーが SSH を使ってプロジェクトをプルダウンできないようにします。
作成者だけがSSHを使ってGitにアクセスできるようにするには、次のようにします:
-
/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 "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
を自分のものに置き換えてください。Let’sEncrypt証明書がイシューされるように、URLにhttps
を含めることを忘れないでください。sudo GITLAB_ROOT_PASSWORD="strong password" EXTERNAL_URL="https://gitlab.example.com" apt install gitlab-ee
Let’s Encrypt証明書についてもっと知りたい、あるいは自分の証明書を使いたい場合は、GitLabをTLSで設定する方法を読んでください。
設定したパスワードが認識されなかった場合は、ルートアカウントのパスワードのリセットについてをお読みください。
-
数分後、GitLabがインストールされました。
EXTERNAL_URL
で設定した URL を使ってサインインします。ユーザー名にはroot
を、パスワードにはGITLAB_ROOT_PASSWORD
で設定したものを使います。
いよいよGitLabの設定です!
GitLab の設定
GitLabにはいくつかのまともなデフォルト設定オプションが用意されています。このセクションでは、それらを変更してより多くの機能を追加し、GitLabをよりセキュアにします。
いくつかのオプションは管理エリアのUIを使い、いくつかのオプションはGitLabの設定ファイルである/etc/gitlab/gitlab.rb
を編集します。
NGINXの設定
NGINXは、GitLabインスタンスにアクセスするためのウェブインターフェースを提供するために使われます。NGINX をよりセキュアに設定するための詳細は、NGINX の堅牢化についてをご覧ください。
メールの設定
次はメールサービスの設定です。メールは、新規登録の確認やパスワードのリセット、GitLab のアクティビティを通知するために重要です。
SMTP の設定
このチュートリアルでは、SMTPサーバーを設定し、MailgunSMTPプロバイダーを使用します。
まず、ログイン認証情報をコンテナする暗号化ファイルを作成し、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_configuration/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回以上サインインに失敗した場合など、いくつかの条件が満たされるとアカウントがロックされます。
この機能は機能フラグの後ろにあります。有効にするには
-
Railsコンソールに入ります:
sudo gitlab-rails console
-
機能フラグを有効にします:
Feature.enable(:require_email_verification)
-
有効かどうかをチェックします(
true
を返すはずです):Feature.enabled?(:require_email_verification)
詳細については、アカウントの電子メール認証についてをお読みください。
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インスタンスを公開する予定がないのなら、サインアップを無効にしておきましょう。
- 特定のメールドメインを使ったサインアップを許可または拒否します。
- 新規ユーザーのパスワード長さの下限設定。
- 全ユーザーに対する二要素認証の強制。
GitLabインスタンスの堅牢化以外にも、GitLabが提供するCI/CD機能を活用するための独自のランナーの設定や、インスタンスの適切なバックアップなど、設定できることはたくさんあります。
インストール後の手順についてはこちらをご覧ください。