チュートリアルシングルノードのGitLabインスタンスのインストールとセキュリティ

このチュートリアルでは、最大1,000ユーザーを収容できるシングルノードのGitLabインスタンスをインストールしてセキュアに設定する方法を学びます。

シングルノードの GitLab インスタンスをインストールし、セキュアに設定するには:

  1. サーバーのセキュリティ
  2. GitLabのインストール
  3. GitLabの設定
  4. 次のステップ

前提条件

  • ドメイン名とDNSの正しいセットアップ
  • 以下の最低スペックを持つ Debian ベースのサーバ:
    • 8 vCPU
    • 7.2GBメモリ
    • すべてのリポジトリに十分なハードドライブの空き容量。ストレージ要件について詳しくはこちらをご覧ください。

サーバーのセキュリティ

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. 最後に、設定をアクティブにします。以下は、パッケージを最初にインストールするときに一度だけ実行する必要があります。プロンプトが表示されたら、「はい」(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 に重複したエントリがないか確認してください。

作成者だけがSSHでGitにアクセスできるようにします。

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

作成者だけがSSHを使ってGitにアクセスできるようにするには、次のようにします:

  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 のように、以下を追加してください。

    note
    これは、最後に処理されたパラメータがそれ以前のパラメータを上書きする可能性があるため、インポートとして重要です。
    ##
    ## 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 "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 を自分のものに置き換えてください。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で設定する方法を読んでください。

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

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

  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_configuration/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. Railsコンソールに入ります:

    sudo gitlab-rails console
    
  2. 機能フラグを有効にします:

    Feature.enable(:require_email_verification)
    
  3. 有効かどうかをチェックします(true を返すはずです):

    Feature.enabled?(:require_email_verification)
    

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

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インスタンスを公開する予定がないのなら、サインアップを無効にしておきましょう。
  • 特定のメールドメインを使ったサインアップを許可または拒否します。
  • 新規ユーザーのパスワード長さの下限設定。
  • 全ユーザーに対する二要素認証の強制。

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

インストール後の手順についてはこちらをご覧ください。