Nix OSでセキュアブートを有効にする方法

# Nix OSでセキュアブートを有効にする方法

## 目次

- [はじめに](#はじめに)
- [参考](#参考)
- [準備](#準備)
    - [必須項目](#必須項目) 
        - [UEFIモードの確認](#UEFIモードの確認)
    - [必要なパッケージのインストールとセットアップモードの入り方](#必要なパッケージのインストールとセットアップモードの入り方)
        - [必要なパッケージ](#必要なパッケージ)
        - [nivをインストール](#nivをインストール)
    - [セットアップモードの入り方](#セットアップモードの入り方)
    - [Configuration.nix](#Configuration.nix)
- [セキュアブート実現](#セキュアブート実現)
    - [キーを作成](#キーを作成)
    - [Configuration.nixを編集](#Configuration.nixを編集)
        - [追加する項目](#追加する項目)
    - [セキュアブート有効化](#セキュアブート有効化)
    - [再起動後、セキュアブートを確認](#再起動後、セキュアブートを確認)
- [おわりに](#おわりに)

## はじめに

私は普段、Windowsでゲームを、Linuxで開発を行っています。
そこで、WindowsでValorantを遊ぼうとなったときに、このようなエラーが出ました

![ValorantTPM2.0Error](https://d1q3zw97enxzq2.cloudfront.net/images/VAN9001.width-1000.format-webp.webp)

TPM2.0を有効にするにはセキュアブートを導入するしか方法はなく、そのセキュアブートを導入する方法を説明していきます。

## 参考

- [Nix OS Secure Boot](https://github.com/nix-community/lanzaboote/blob/master/docs/QUICK_START.md)
- [Vanguard制限](https://support-valorant.riotgames.com/hc/ja/articles/22291331362067-Vanguard%E5%88%B6%E9%99%90)
- [私のConfiguration.nix](https://github.com/Nusk-Rbb/nix-dotfiles/blob/main/laptop/intel/configuration.nix) 

## 準備

### 必須項目

1. NixOSがUEFIモードであること
1. Systemd-bootを使用していること(Grubの場合はSystemd-bootにする場合があります)

#### UEFIモードの確認

```terminal
$ bootctl status
```

### 必要なパッケージのインストールとセットアップモードの入り方

#### 必要なパッケージ

1. sbctl >= 0.16
1. niv >= 0.41

#### nivをインストール

```terminal
# cd /etc/nixos && niv init
# niv add nix-community/lanzaboote -r v0.4.1 -v 0.4.1
```

#### セットアップモードの入り方

1. セキュアブートのメニューを選択
1. セキュアブートをEnableにする
1. Reset to Setup Modeを押す
1. Saveして再起動する

### Configuration.nix

最終的にはこのようなConfiguration.nixになりました

```nix
{ config, lib, pkgs, ... }:

let
  sources = import ./nix/sources.nix;
  lanzaboote = import sources.lanzaboote;
  unstable = import <nixos-unstable> { config = { allowUnfree = true; }; };
in

{
  imports =
    [ # Include the results of the hardware scan.
      ./hardware-configuration.nix
      <home-manager/nixos>       
      lanzaboote.nixosModules.lanzaboote
    ];

  # Lanzaboote currently replaces the systemd-boot module.
  # This setting is usually set to true in configuration.nix
  # generated at installation time. So we force it to false
  # for now.
  boot.loader.systemd-boot.enable = lib.mkForce false;
  #boot.loader.systemd-boot.enable = true;
  boot.loader.efi = {
    canTouchEfiVariables = true;
    efiSysMountPoint = "/boot";
  };

  boot.lanzaboote = {
    enable = true;
    pkiBundle = "/var/lib/sbctl";
  };

#...
```

[My Configuration.nix](https://github.com/Nusk-Rbb/nix-dotfiles/blob/main/laptop/intel/configuration.nix)

## セキュアブート実現

### キーを作成

```terminal
$ sudo sbctl create-keys
```

もし、/etc/securebootに鍵が存在した場合はこれを実行する

```terminal
$ sudo sbctl setup --migrate
```

Microsoftのキーを登録する

```terminal
$ sudo sbctl enroll-keys --microsoft
```

### Configuration.nixを編集

#### 追加する項目

importsの前にこれを追加してください

```nix
let
  sources = import ./nix/sources.nix;
  lanzaboote = import sources.lanzaboote;
  unstable = import <nixos-unstable> { config = { allowUnfree = true; }; };
in
```

importsにこれを追加

```nix
lanzaboote.nixosModules.lanzaboote
```

Sytemd-bootのenableのtrueをlib.mkForceとfalseに変更

```nix
boot.loader.systemd-boot.enable = lib.mkForce false;
```

lanzabooteを有効化

```nix
boot.lanzaboote = {
  enable = true;
  pkiBundle = "/var/lib/sbctl";
};
```

変更し終わったら、bootに変更を加えます

```terminal
# nixos-rebuild boot
```

### セキュアブート有効化

あとはBIOSでセキュアブートを有効化するだけ

### 再起動後、セキュアブートを確認

```terminal
$ sbctl status
```

## おわりに

これでセキュアブートを実現できたので、Dual BootのWindowsPCでもValorantができるようになります！
~~Windowsはゲーム専用OS~~