proxy下でのUbuntu Livepatchの有効化 (CUI操作のみ)

# この記事の目的

Ubuntu16.04から実装され、Ubuntu18.04では利用開始までの手順が容易になったLivePatch機能。これはマシンを再起動せずにセキュリティパッチを適用できる優れもので、Ubuntuを常時起動のリモートサーバとして運用しているようなケースで極めて有用である。

この機能を有効にする手順の説明はWebに数多転がっているが、Proxy環境下でのセットアップに関する情報がどれも古くて困ったので、ここに残しておく。なお、GUIで設定する場合は落とし穴はない様子なのでここでは割愛する。（もしかして大半の人々はUbuntuをCUI-onlyでは利用していない…？）

ここで解説するのはUbuntu18.04LTSのケースです。そしてLivePatchが使えるのはLTS版のみだそうです。あしからず。

# 手順のサマリ

1. 事前準備
    1. UbuntuOneにユーザ登録
    - UbuntuOneからトークンを取得
- マシンでのセットアップ
    1. snapにProxy情報を登録
    2. snapでcanonical-livepatchをインストール
    3. **canonical-livepatchにProxy情報を登録 ★**
    4. canonical-livepatchdをリスタート
    5. Keyを登録してlivepatch有効化

**★**:この記事で重要なところ（逆にこれ以外の手順はどこにでも載ってる）

# 詳解
## 事前準備

この手順はブラウザで行うので、どのマシンから作業してもよい。手元のスマホでもOK。

1. https://login.ubuntu.com/ にアクセス
    1. 「I don’t have an Ubuntu One account」をチェック
    2. メアドetcを入力してユーザ登録
    3. 登録したメアドに確認メールが届いたらメール内のリンクを押してメアドをverifyすると正式登録完了
2. https://ubuntu.com/livepatch を開く
    1. 「Ubuntu user」をチェック
    2. 「Get your Livepatch token」をクリック
    3. 「The key for your <EMAIL-ADDRESS> account is:」の次の行にトークン(`XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX`)が表示されるのでメモしておく


## マシンでのセットアップ
### snapにProxy情報を登録

次のコマンドを打ち、snap設定の編集画面を開く。

```console
$ sudo systemctl edit snapd.service
```

編集画面がnanoエディターで起動しているはずなので、以下の内容を打ち込む。ショートカットキー「`ctrl`+`o`」で編集内容の保存、「`ctrl`+`x`」で編集画面から抜けることができる。

```dot
[Service]
Environment=http_proxy=http://<PROXY>:<PORT>
Environment=https_proxy=http://<PROXY>:<PORT>
```

次に、デーモンの設定をリロードしてサービスを再起動すれば、Proxyサーバ経由でsnapが通信できるようになる。

```console
$ sudo systemctl daemon-reload
$ sudo systemctl restart snapd.service
```

### snapでcanonical-livepatchをインストール

次の通り、snapコマンドでcanonical-livepatchをインストールする。

```console
$ sudo snap install canonical-livepatch
canonical-livepatch 9.5.5 from Canonical✓ installed
```

### canonical-livepatchにProxy情報を登録 ★

ここが重要。Webでは`/var/snap/canonical-livepatch/config`というファイルを編集してProxy情報を記入せよという情報が大量に見つかるが、それはどうやらもう古いらしい。
実際、`/var/snap/canonical-livepatch/config`というファイルを作っても何も反映されなかった。

**2020年7月19日時点では、`$ sudo canonical-livepatch config`というコマンドを用いてproxy情報などを登録する必要がある。**

まず、設定内容の確認をする。デフォルトでは当然http-proxyもhttps-proxyも何も入力されていないことが確認できる。

```console
$ sudo canonical-livepatch config
http-proxy: ""
https-proxy: ""
no-proxy: ""
remote-server: https://livepatch.canonical.com
ca-certs: ""
check-interval: 60  # minutes
```


次に、`$ sudo canonical-livepatch config <KEY>=<VALUE>`というコマンドを用いて、設定可能な項目(`<KEY>`)に対し、設定内容(`<VALUE>`)を付与する。
したがって、Proxyを設定する場合は

```console
$ sudo canonical-livepatch config http-proxy=http://<PROXY>:<PORT> https-proxy=http://<PROXY>:<PORT>
```
とすればよい。

もちろん、認証プロキシの場合は
`http://<PROXY>:<PORT>`の部分を`http://<USER>:<PSW>@<PROXY>:<PORT>`に変更すればよい。

ここで注意すべきは**「引用符`" "`抜き」**でProxy情報を入力することである。configの確認画面で

```
http-proxy: ""
https-proxy: ""
```

とダブルクオーテーション付きになっていたからといって、`sudo canonical-livepatch config http-proxy="http://<PROXY>:<PORT>"`としてはいけない。私はこの落とし穴にハマってしばらくProxyを突破できなかった。かなしい。

最後に、設定が正しく反映されているかを確認しておく。

```console
$ sudo canonical-livepatch config
http-proxy: http://<USER>:<PSW>@<PROXY>:<PORT>
https-proxy: http://<USER>:<PSW>@<PROXY>:<PORT>
no-proxy: ""
remote-server: https://livepatch.canonical.com
ca-certs: ""
check-interval: 60  # minutes
```

### canonical-livepatchdをリスタート

configを確認したときにちゃんと反映されていれば、リスタートしなくても大丈夫っぽいが、念のため。（私はリスタートしなくても大丈夫でした）

```console
$ sudo service snap.canonical-livepatch.canonical-livepatchd restart
```

### Keyを登録してlivepatch有効化

最後に、事前準備で控えておいたトークン(KEY)を使って有効化する。

```console
$ sudo canonical-livepatch enable XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```

有効になったかどうかを確認する。

```console
$ canonical-livepatch status
last check: 15 minutes ago
kernel: 4.15.0-91.92-generic
server check-in: succeeded
patch state: ✓ all applicable livepatch modules inserted
patch version: 68.1
```

`last check`とか`server check-in`とかが成功しているっぽい内容になっていれば登録完了。

おつかれさまでした！