はじめてのラズパイ①~UbuntuServerを添えて~


ネットワークの勉強がてらに、raspberry pi 4Bを買ってみました。
自分のUbuntuServer構築手順を備忘録としてかきます。
間違っている点や間違っている点がありましたらご指摘いただけると幸いです！

~~P.S.
とりあえずやってみた感が凄いので、後にsoftetherVPN構築予定です。~~
構築しました！

https://qiita.com/sgash708/items/d849541c77a7873ef519

https://qiita.com/sgash708/items/b8bdfe63502433109f11

# かわいいラズパイ
### 買ったもの
* raspberry pi 4B(RAM 4GB)
* セット
    * ケース
    * 5.1V 3A USB-C 電源アダプター(スイッチ付き)
    * 冷却ファン
    * ヒートシンク
* Transcend マイクロSDカード 32GB

トータルで1万円くらいでした、とても良いですね :relaxed:
![IMG_7391.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429019/92d47230-8d81-f674-2cf2-31ad0e54f4b8.jpeg)

# TODO
・Ubuntuインストールと起動
・ユーザ設定
・公開鍵の登録
・SSH設定

# 前提
|    | 技術  |
| ---- | ---- |
|  OS  |  Ubuntu Server 20.10  |
|  サーバ  |  raspberry pi 4B(RAM 4GB)(arm64)  |
|  クライアント  |  macOS Big Sur 11.2.2  |

# 手順
## 1. Ubuntuインストール
クライアント側で<code>Raspberry Pi Imager</code>を使い、microSDカードに書き込みます。
書き込みが終わったら、ラズパイにmicroSDを差し込み電源をいれ起動させてください。

[イメージャーのインストール(ver1.5)はこちら](https://downloads.raspberrypi.org/imager/imager_1.5.dmg)
[イメージャーの一覧はこちら](https://downloads.raspberrypi.org/imager/)

## 2. 初期設定
サーバへログインします。
Ubuntuの初期設定は下記です。
初回ログイン時にパスワードを変更してください。

```bash:サーバ
User: ubuntu
Password: ubuntu
```

### 2-1. ユーザ追加
ログイン後に作業ユーザを作成し、<code>sudo</code>権限を付与します。
当たり前ですが、以降<code>sudo</code>コマンドの使用が可能です。

```bash:サーバ
$ sudo adduser sampleuser
$ sudo adduser sampleuser sudo
# 初期ユーザ(ubuntu)のパスワードを削除
$ sudo passwd -d ubuntu
$ sudo passwd -l ubuntu
$ sudo passwd -l root

# ubuntuユーザ削除
$ sudo userdel -r ubuntu
$ sudo rm -rf /home/ubuntu
```

サーバのログイン時にパスワードとしてつかったり、<code>sudo</code>コマンド入力時に使用するので忘れないようにしてください。

※もし忘れた方がいたら、シングルユーザモードで起動し直すかOSの再インストールをして下さい。
https://ochanjanai.net/it/301

### 2-2. Datetime変更

問題が発生したときに時間の確認がしづらいのでサーバの時間を設定します。

```bash:サーバ
$ date
Sun Mar  7 05:07:18 UTC 2021
$ timedatectl
               Local time: Sun 2021-03-07 05:07:18 UTC
           Universal time: Sun 2021-03-07 05:07:18 UTC
                 RTC time: n/a                        
                Time zone: Etc/UTC (UTC, +0000
System clock synchronized: yes                        
              NTP service: active                     
          RTC in local TZ: no                         
$ timedatectl set-timezone Asia/Tokyo
$ timedatectl
               Local time: Sun 2021-03-07 14:07:44 JST
           Universal time: Sun 2021-03-07 05:07:44 UTC
                 RTC time: n/a                        
                Time zone: Asia/Tokyo (JST, +0900)    
System clock synchronized: yes                        
              NTP service: active                     
          RTC in local TZ: no                         
$ date
Sun Mar  7 14:07:54 JST 2021
```

### 2-3. ipアドレスの確認
あとでSSH接続するにあたって、ipが特定できれば良いです。
クライアント側から<code>arp</code>コマンドなどで特定しても良いですが、サーバの作業ついでにやります。
~~私は、IPアドレスはルータ側で固定していますので自身の環境に合わせて設定してください。~~
→ルータではなくラズパイ本体で固定にしました。

```bash:サーバ
$ ip a
# ~省略~
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 192.168.3.xxx/24 brd 192.168.3.255 scope global dynamic eth0
# ~省略~
```

## 3. 公開鍵の設定
クライアント側で認証キーを作成し、公開鍵をサーバに登録していきます。
あまりないと思いますが、間違って秘密鍵をサーバに登録しないように注意してください。

### 3-1. 認証キー作成

* <code>-C ""</code>で<code>username@hostname</code>をコメントアウト
* <code>-f</code>オプションでファイル名指定


参考：
https://dev.classmethod.jp/articles/ssh-keygen-tips/

```bash:クライアント
$ cd ~/.ssh
$ ssh-keygen -t rsa -f id_rsa_sampleuser -C ""
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in id_rsa_sampleuser.
Your public key has been saved in id_rsa_sampleuser.pub.
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxx username@hostname.local
The key\'s randomart image is:
# ~省略~

# 復号化して結果が一致しているかチェック
$ cat id_rsa_sampleuser.pub
$ chmod 600 id_rsa_sampleuser
$ ssh-keygen -y -f id_rsa_sampleuser
```

### 3-2. 公開鍵をサーバに登録
クライアント側から公開鍵をおくります。

```bash:クライアント
$ cd ~/.ssh
$ rsync -av id_rsa_sampleuser.pub sampleuser@192.168.3.xxx:~/
# サーバにSSH接続
$ ssh sampleuser@192.168.3.xxx
```

```bash:サーバ
$ pwd
/home/sampleuser
$ ls
id_rsa_sampleuser.pub
$ mkdir .ssh
$ mv id_rsa_sampleuser.pub .ssh/authorized_keys
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys
```

### 参考
https://qiita.com/suthio/items/2760e4cff0e185fe2db9

## 4. SSH設定
### 4-1. 公開鍵認証
先程の公開鍵をサーバ側で認証します。

```bash:サーバ
$ sudo su
[sudo] password for sampleuser: 入力 
# 以下、rootユーザで作業
$ cd /etc/ssh
$ cp -p sshd_config sshd_config.bk
$ vi sshd_config
# ~省略~
41 # Expect .ssh/authorized_keys2 to be disregarded by default in future.
42 AuthorizedKeysFile      .ssh/authorized_keys #公開鍵を指定
# ~省略~
57 # To disable tunneled clear text passwords, change to no here!
58 PasswordAuthentication no #yes→no:パスワード認証を許可しない
59 PubkeyAuthentication yes  #追記:公開鍵認証を許可
60 RSAAuthentication yes     #追記:RSA認証を許可

$ service sshd restart
# rootユーザから抜ける
$ exit
$ cd
```

### 参考
https://www.atmarkit.co.jp/flinux/rensai/linuxtips/430dnypsswdacces.html

### 4-2. SSH接続
今度はクライアント側から接続して確認してみます。
サーバ側の接続状態を保ったままにしておくと、接続できない際に対応しやすいかもしれません。

```bash:クライアント
$ ssh -i ~/.ssh/id_rsa_sampleuser sampleuser@192.168.3.xxx
Welcome to Ubuntu 20.10 (GNU/Linux 5.8.0-1006-raspi aarch64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Sun Mar  7 17:01:49 JST 2021

  System load:           0.0
# ~省略~
```

### 4-3. config追記
SSH接続の際に入力するのを楽にします。

```bash:クライアント
$ vi ~/.ssh/config
Host sampleRBP 
  HostName 192.168.3.xxx
  User sampleuser
  IdentityFile ~/.ssh/id_rsa_sampleuser

$ ssh sampleRBP
Welcome to Ubuntu 20.10 (GNU/Linux 5.8.0-1006-raspi aarch64)
# ~省略~
```

## おまけ
<code>avahi-daemon</code>をいれてUbuntuをmDNS(multicast DNS)に対応させます。
メリットは、
>特別な設定無しで、ローカルネットワーク上で稼働しているサー ビスやホストをプログラムが公開したり検出できるようにします。たとえば、 ネットワークに接続してすぐに印刷可能なプリンタや閲覧できるファイル、話すこ とができる相手が見つけられます。
>本パッケージには Avahi デーモンが含まれており、ネットワーク上であなたの マシンを表示したり、他のアプリケーションが mDNS/DNS-SD レコードの発行や 解決を行なえるようにします。

### 引用
https://packages.debian.org/ja/sid/avahi-daemon

```bash:サーバ
# ホスト名確認
$ hostname
ubuntu
# ホスト名変更
$ sudo hostnamectl set-hostname sample
$ sudo apt install avahi-daemon
$ sudo systemctl start avahi-daemon
$ sudo systemctl enable avahi-daemon
```

```bash:クライアント
$ ssh sampleuser@sample.local -i ~/.ssh/id_rsa_sampleuser
Welcome to Ubuntu 20.10 (GNU/Linux 5.8.0-1006-raspi aarch64)
# ~省略~
```

さらに、<code>.ssh/config</code>を修正してより快適なSSHを...

```bash:クライアント
$ vi ~/.ssh/config
Host sampleRBP 
  HostName sample.local
  User sampleuser
  IdentityFile ~/.ssh/id_rsa_sampleuser
```

### 参考
https://qiita.com/takish/items/1a640576caa2d0dfefc4