Raspberry Pi 4にUbuntu Serverを入れて初期設定をするまで【簡単なセキュリティを添えて】

この記事の内容は間違っている、正確でない、効率的ではないなどの可能性が大いにあります。コマンド等は理解してから実行をする事を推奨します。

## Ubuntuのimageをダウンロード
![Ubuntu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430774/eb0babc3-30f6-9189-4140-6eb3b0861356.png)

 [Install Ubuntu Server on a Raspberry Pi 2, 3 or 4](https://ubuntu.com/download/raspberry-pi)から適当なイメージをダウンロードする。
Raspbianは32bitしかないけど(追記:最近64bit版が公開されたらしい)Ubunutuは64bitイメージがある。
Ubuntu 18.04.4 LTS 64bitが個人的にはオススメ。

## 書き込む
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430774/0d42b6a8-a834-f473-25ac-6b481d3b4e7c.png)

microSDに書き込む。MacならbalenaEtcherみたいなアプリで入れるとフォーマットもやってくれるので楽。balenaEtcherならimageにダウンロードした.imgを指定して、targetにmicroSDを指定する。
USB3.0に対応したリーダーで書き込むと良い。このあとの設定でミスって再書き込みとかは良くあるので本当に初心者なら絶対に買っとくと良い。1000円もあれば安いの買えるので。

## 先にwifi設定する
SDカードの名前がsystem-bootになっているので（なってないならそれっぽいのを探す）、それをマウントして「***network-config***」を書き換える。
注: balenaEtcheで書き込むと自動的にアンマウントされるので、ディスクユーティリティを使うなり刺し直すなりして再度マウントする必要がある。

これを

``` yml
# 省略
version: 2
ethernets:
  eth0:
    dhcp4: true
    optional: true
# 省略
```

こうじゃ(複数のwifiを使えるなら同時に書き込んでおくと良い。無いならSSID2以下は削除)

``` yml
# https://netplan.io/reference
version: 2
ethernets:
  eth0:
    dhcp4: true
    optional: true
wifis:
  wlan0:
    dhcp4: true
    optional: true
    access-points:
      "SSID1":
        password: "PSSWORD1"
      "SSID2":
        password: "PSSWORD2"
```

これでwifi接続の時プライベートIPを固定するならばこう

``` yml
# https://netplan.io/reference
version: 2
ethernets:
  eth0:
    dhcp4: true
    optional: true
wifis:
  wlan0:
    dhcp4: false
    dhcp6: false
    optional: true
    addresses: [192.168.1.XX/24] #設定するIP
    gateway4: 192.168.1.1 #ルーターのIP---1
    nameservers:
      addresses: [192.168.1.1] #1と同じ
      search: []
    access-points:
      "SSID1":
        password: "PASSWORD1"
      "SSID2":
        password: "PASSWORD2"
```

これでアンマウント。ラズパイに差し込んで起動。

Memo: この設定を今後変更したい場合はラズパイ側の`/etc/netplan/50-cloud-init.yaml`で変更できる。

## 最初のログイン
モニターとキーボードにつないでまずはログイン。
ID: ***ubuntu***
PW: ***ubuntu***
でログイン。
一旦rebootして、再度ログイン。こうするとログイン後の説明に「プライベートIPが192.168.1.XXだよ〜」と表示される。(IP address for wlan0: 192.168.1.XXと出ればOK。もしかしたら環境によって出ないかも)

適当な別のPCで`ssh ubuntu@192.168.1.XX`でログイン。

Memo: cloud-initの設定をもう少しやればヘッドレスで完結できる気がする
Memo: 適当な段階でsudo apt updateとsudo apt upgradeをやっとくと良い

## キーボードの設定
現在ラズパイで直接キーボードを使う時、英字キーボード配列が参照されているため、日本語キーボードを参照するように変更していく。

```
sudo dpkg-reconfigure keyboard-configuration
```
私は***Generic 105-key PC(intl.)***のJapanese選択、その後はエンター連打でよかったが、使用しているキーボードに合わせて設定しとく。急にssh接続ができなくなった時にキーボードが十分叩ける状態じゃないと大変なのでやっておくこと。

## SSHの設定
```
sudo vi /etc/ssh/sshd_config
```

***/etc/ssh/sshd_config***の中の1行を書き換える。

```
#Port 22 #これを
Port 53008 #これに(値は49152–65535の範囲で任意に設定できる)
```
これでSSHのポート番号が変更された。
今後SSH接続するときは

```
ssh USERNAME@192.168.1.XX -p 53008
```

で入れる。

Memo: 外部ネットワークに公開しないなら変更しなくても良い気がする。

## ユーザーの追加とロック

```
sudo adduser USERNAME
sudo adduser USERNAME sudo
```

ユーザーの作成をし、***ユーザーをsudoグループに追加。***

```
sudo passwd -d ubuntu
sudo passwd -l ubuntu
sudo passwd -l root
```

でubuntuとrootをロック。exitでubuntuから抜ける。


***注: この段階でログインが可能なユーザーは新規に作成したユーザーのみとなります。***

Memo: ロックしてもsudo suで入ることはできる。しかし、少なくとも一度sudoグループに入っているユーザー、あるいは管理者権限をもったユーザーにログインできないとそのユーザーは使えない。
Memo: 何もしてなければrootのパスワードは設定されておらず、そもそもログインできない。(確認は`sudo cat /etc/shadow`rootを読めばできる。)同様にpasswd -dでubuntuのパスワードも削除している。なので実はsudo passwd -lの2行は必要ない。

# VSCode Remote Development

いちいち -p 53008をつけて接続するのは面倒なので.ssh/configに設定をする。
ついでにVSCodeで接続できるようにもする。

ローカル側で${HOME}/.ssh/configを作成し編集

```
vi ${HOME}/.ssh/config
```

```config
Host 任意の名前
  HostName 192.168.1.XX
  User ログインするユーザー名
  Port 53008
```

VSCodeの[Remote Development](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack)を入れて、
<img width="1336" alt="RemoteDeveloment.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430774/68b8e9bb-be97-d499-c919-f1d8ba3a2b8f.png">

左のアクティビティバーに追加されたリモートエクスプローラーをクリックし、SSH Targetsに先程作成したcofigが反映されている事を確認する。
反映されていないならばリモートエクスプローラーのSSH TARGETSのところにある歯車から \${HOME}/.ssh/config があるか確認し、VSCodeを再起動する。
設定したHOST名をクリックするとパスワードの入力を求められるので、ログインするユーザーと合致するパスワードを入力する。
これでVSCodeでRaspberry Piの開発が可能となる。

# 公開鍵認証(オプション)
認証をパスワードから公開鍵に移行する事で便利、あるいは(設定次第ではあるが）よりセキュアになる。
ざっくりとした手順だが、

1. ローカル側でid_rsa,id_rsa.pubを`ssh-keygen -t rsa`で作成。
2. id_rsa.pubの内容をRaspberry Piの${HOME}/.ssh/authorized_keysに追加

でできる。詳しくは調べると出てくる。authorized_keysはパーテーションを600にすること。
パスワードでのSSH接続を拒否することもできる。
パスワード認証を拒否する/etc/ssh/sshd_configのPasswordAuthenticationをnoに設定するとよりセキュアになる。
注: PubkeyAuthentication no(公開鍵認証を拒否）の環境でPasswordAuthenticationまで拒否しないこと
# ファイアーウォール
ubuntuでは標準でポートが全て閉じられており、公開しないならファイアーウォールの設定をしなくても良いという話もある。

試しにnmapでポートスキャンしてみる。
結果は80/110/143がTCPで開いてる。22番は閉じてるので、あまり弄らなくてもいいかなとは思うが、今後の事も考えて設定するのに慣れておくためにも設定しておく。

```
sudo ufw allow XXX/tcp
```
でポート番号やプロトコルのルールを設定。

```
sudo ufw enable
sudo ufw logging on
sudo ufw reload
sudo ufw status verbose
```

など。