正式なドキュメントは英語版であり、この日本語訳はAI支援翻訳により作成された参考用のものです。日本語訳の一部の内容は人間によるレビューがまだ行われていないため、翻訳のタイミングにより英語版との間に差異が生じることがあります。最新かつ正確な情報については、英語版をご参照ください。

チュートリアル: 単一ノードGitLabインスタンスをインストールしてセキュリティを設定する

  • プラン: Free、Premium、Ultimate
  • 提供形態: GitLab Self-Managed

このチュートリアルでは、最大20 RPSまたは1,000ユーザーに対応できる単一ノードのGitLabインスタンスを安全にインストールおよび設定する方法を学びます。

単一ノードのGitLabインスタンスをインストールし、安全に設定するには:

  1. サーバーを保護する
  2. GitLabをインストールする
  3. GitLabを設定する
  4. 次の手順

はじめる前

  • ドメイン名、および正しいDNSの設定
  • 次の最小仕様を持つDebianベースのサーバー:
    • 8 vCPU
    • 7.2 GBメモリ
    • すべてのリポジトリに十分なハードドライブ容量。ストレージ要件の詳細については、こちらをご覧ください。

サーバーを保護する

GitLabをインストールする前に、サーバーをより安全に設定することから始めます。

ファイアウォールを設定する

ポート22(SSH)、80(HTTP)、および443(HTTPS)を開く必要があります。これは、クラウドプロバイダーのコンソールを使用するか、サーバーレベルで行うことができます。

この例では、ufwを使用してファイアウォールを設定します。すべてのポートへのアクセスを拒否し、ポート80および443を許可し、最後にポート22へのアクセスをレート制限します。ufwは、過去30秒間に6回以上接続を試みたIPアドレスからの接続を拒否できます。

  1. ufwをインストールします:

    sudo apt install ufw
  2. ufwサービスを有効にして開始します:

    sudo systemctl enable --now ufw
  3. 必要なポートを除くすべてのポートを拒否します:

    sudo ufw default deny
    sudo ufw allow http
    sudo ufw allow https
    sudo ufw limit ssh/tcp
  4. 最後に、設定を有効にします。以下は、パッケージを初めてインストールするときに1回だけ実行する必要があります。プロンプトが表示されたらyes(y)と答えます:

    sudo ufw enable
  5. ルールが存在することを確認します:

    $ 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が公開鍵認証を受け入れるように設定し、潜在的なセキュリティリスクとなる一部の機能を無効にします。

  1. /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
  2. ファイルを保存し、SSHサーバーを再起動します:

    sudo systemctl restart ssh

    SSHの再起動が失敗した場合は、/etc/ssh/sshd_configに重複するエントリがないことを確認してください。

承認されたユーザーのみがGitアクセスにSSHを使用していることを確認する

次に、SSH経由でGit操作を実行できる有効なGitLabアカウントを持っていない限り、ユーザーがSSHを使用してプロジェクトをプルできないようにします。

承認されたユーザーのみがGitアクセスにSSHを使用していることを確認するには:

  1. お使いの/etc/ssh/sshd_configファイルに以下を追加します:

    # Ensure only authorized users are using Git
    AcceptEnv GIT_PROTOCOL
  2. ファイルを保存し、SSHサーバーを再起動します:

    sudo systemctl restart ssh

いくつかのカーネル調整を行う

カーネル調整は攻撃の脅威を完全に排除するものではありませんが、セキュリティのレイヤーをさらに追加します。

  1. お使いのエディタで/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
  2. 次回のサーバー再起動時に、値は自動的に読み込まれます。すぐに読み込むには:

    sudo sysctl --system

お疲れ様でした。サーバーを保護する手順が完了しました!これでGitLabをインストールする準備ができました。

GitLabをインストールする

サーバーの設定が完了したので、GitLabをインストールします:

  1. 必要な依存関係をインストールして設定します:

    sudo apt update
    sudo apt install -y curl openssh-server ca-certificates perl locales
  2. システム言語を設定します:

    1. /etc/locale.genをエディタで開き、en_US.UTF-8がコメントアウトされていないことを確認します。

    2. 言語を再生成します:

      sudo locale-gen
  3. 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にアクセスしてください。

  4. 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-ee

    Let’s Encrypt証明書の詳細、または独自の証明書を使用する方法については、TLSでGitLabを設定する方法をお読みください。

    設定したパスワードが適用されなかった場合は、ルートアカウントパスワードのリセットについて詳細をお読みください。

  5. 数分後、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を設定します:

  1. SMTPサーバーの認証情報を含むYAMLファイル(例: smtp.yaml)を作成します。

    SMTPパスワードには、RubyまたはYAMLで使用される文字列デリミタ(例: ')を含めないでください。設定の処理中に予期せぬ動作が発生するのを避けるためです。

    user_name: '<SMTP user>'
    password: '<SMTP password>'
  2. ファイルを暗号化します:

    cat smtp.yaml | sudo gitlab-rake gitlab:smtp:secret:write

    デフォルトでは、暗号化されたファイルは/var/opt/gitlab/gitlab-rails/shared/encrypted_settings/smtp.yaml.encの下に保存されます。

  3. YAMLファイルを削除します:

    rm -f smtp.yaml
  4. /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>"
  5. ファイルを保存して、GitLabを再設定します:

    sudo gitlab-ctl reconfigure

これでメールを送信できるようになります。設定が機能したことをテストするには:

  1. Railsコンソールを入力します:

    sudo gitlab-rails console
  2. コンソールプロンプトで次のコマンドを実行して、GitLabからテストメールを送信します:

    Notify.test_email('<email_address>', 'Message Subject', 'Message Body').deliver_now

メールを送信できない場合は、SMTPトラブルシューティングセクションを参照してください。

ロックされたアカウントのメール確認を必須にする

アカウントのメール確認は、GitLabアカウントのセキュリティにさらなるレイヤーを提供します。特定の条件(たとえば、24時間以内に3回以上サインインに失敗した場合)が満たされると、アカウントがロックされます。

前提条件:

  • 管理者である必要があります。

ロックされたアカウントのメール確認を必須にするには:

  1. 右上隅で、管理者を選択します。
  2. 設定 > 一般を選択します。
  3. サインインの制限を展開します。
  4. ロックしたアカウントのメール認証チェックボックスを選択します。
  5. 変更の保存を選択します。

詳細については、アカウントメール確認についてお読みください。

S/MIMEで送信メールに署名する

GitLabから送信される通知メールは、セキュリティを向上させるためにS/MIMEで署名できます。

単一のキーと証明書ファイルのペアを提供する必要があります:

  • 両方のファイルはPEMエンコードされている必要があります。
  • キーファイルは、GitLabがユーザーの介入なしにそれを読み取りできるように、暗号化されていない状態である必要があります。
  • RSAキーのみがサポートされています。
  • (オプション)各署名に含める認証局(CA)証明書のバンドル(PEMエンコード済み)を提供できます。これは通常、中間CAです。
  1. CAから証明書を購入してください。

  2. /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'
  3. ファイルを保存して、GitLabを再設定します:

    sudo gitlab-ctl reconfigure

詳細については、S/MIMEで送信メールに署名する方法についてお読みください。

次の手順

このチュートリアルでは、サーバーをより安全に設定する方法、GitLabをインストールする方法、および一部のセキュリティ標準を満たすようにGitLabを設定する方法を学びました。GitLabを保護するために実行できるその他の手順には、次のようなものがあります:

  • サインアップを無効にする。デフォルトでは、新しいGitLabインスタンスではサインアップがデフォルトで有効になっています。GitLabインスタンスを公開する予定がない場合は、サインアップを無効にする必要があります。
  • 特定のメールドメインを使用したサインアップの許可または拒否。
  • 新規ユーザーのパスワード長の最小制限を設定する。
  • すべてのユーザーに対して2要素認証を強制する。

GitLabインスタンスの強化以外にも、GitLabが提供するCI/CD機能を活用するために独自のRunnerを設定したり、インスタンスを適切にバックアップしたりするなど、設定できることはたくさんあります。

インストール後の手順について詳しくお読みいただけます。