Docker SSH鍵に関するディレクトリ・ファイルの権限は本ユーザにしておこう

# 投稿目的
<ul>
<li>よりよい方法をご教授いただきたい</li>
<li>前回記事の訂正</li>
</ul>

前回記事はこちらです。

https://qiita.com/ko-sato-primebrains/items/623956a96f8e67fece01



# 本題
### そのまま`git clone`するとwarningが発生...
前回の拙著[「Docker 便利なコンテナを作成できるDockerfileを紹介させてください」](https://qiita.com/ko-sato-primebrains/items/623956a96f8e67fece01)において、「すでにWSL上に存在するSSH鍵を、コンテナにもコピーし使用する」という内容をご紹介しました。
前回記事の内容でも、GitHubからのリポジトリclone自体は成功しますが、以下のようなwarningが発生します。
以後に`git fetch`などを実行した際も、同じwarningがずっと表示されます。

```bash
// clone実行
$ git clone [リポジトリのURL]
Cloning into '[リポジトリ]'...

// 「yes」を入力
The authenticity of host 'github.com (20.27.177.113)' can't be established.
[秘密鍵] key fingerprint is [秘密鍵の内容].
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? 
> yes

// warningが発生(失敗)
Failed to add the host to the list of known hosts (/home/$USERNAME/.ssh/known_hosts).

remote: Enumerating objects: 687, done.
remote: Counting objects: 100% (687/687), done.
remote: Compressing objects: 100% (369/369), done.
remote: Total 687 (delta 335), reused 605 (delta 255), pack-reused 0 (from 0)
Receiving objects: 100% (687/687), 686.19 KiB | 1022.00 KiB/s, done.
Resolving deltas: 100% (335/335), done.
```

「**Failed to add the host to the list of known hosts (/home/$USERNAME/.ssh/known_hosts).**」

→「`/home/$USERNAME/.ssh/known_hosts`にホスト情報を追記できませんでした...」という内容ですね。

### `known_hosts`とは 
[参考記事 はてなブログ 様](https://a-mochan.hatenablog.com/entry/2019/12/20/141036)
SSHで接続したホストについて、ホストの公開鍵(共通鍵)が`~/.ssh/known_hosts`に記載されていくようです。
この`~/.ssh/known_hosts`に公開鍵の情報が記載されていると、次回以降もSSH接続がスムーズに実行されます。

先ほどのwarningは「`~/.ssh/known_hosts`に書き込みができなかったよ」という内容です。
ファイルに書き込みができないのは、大抵権限関係の問題があります。
`ls`コマンドで`~/.ssh`ディレクトリの中身を見てみます。
```bash
$ ls -al .ssh
total 16
drwxr-xr-x 1 root      root      4096 Jan 15 13:05 ./
drwxr-x--- 1 $USERNAME $USERNAME 4096 Jan 20 12:22 ../
-rw-r--r-- 1 root      root       411 Jan 15 13:05 id_ed25519
-rw-r--r-- 1 root      root       100 Jan 15 13:05 id_ed25519.pub
```
`~/.ssh`ディレクトリ自体も、配下のファイル類もすべて`root`の持ち物になってしまっています...
これを`$USERNAME`の持ち物にすれば、うまくできそうです。

### Dockerfileの内容を修正する
今回のDockerfileはこちらです。
```Dockerfile
FROM ubuntu:latest

# 必要なパッケージ類のインストール(ご自身が必要と思うものを追加してください)
RUN apt-get upgrade && apt-get update && apt-get install -y \
  sudo\
  wget\
  git\
  curl\
  tree\
  ssh\
  net-tools\
  docker.io\
  docker-compose-v2\
  python3-setuptools

# ユーザを追加し、sudoをパスワードなしで有効化する
ARG USERNAME=<あなたのユーザ名>
ARG GROUPNAME=<あなたのグループ名>
ARG UID=<あなたのユーザID>
ARG GID=<あなたのグループID>
ARG PASSWORD=<あなたのパスワード>
RUN groupadd -g $GID $GROUPNAME && \
    useradd -m -s /bin/bash -u $UID -g $GID -G sudo $USERNAME && \
    echo $USERNAME:$PASSWORD | chpasswd && \
    echo "$USERNAME   ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
USER $USERNAME
WORKDIR /home/$USERNAME/

# Gitのタブ補完を有効化するためのスクリプトを取得
RUN wget https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash -O ~/.git-completion.bash
RUN wget https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh -O ~/.git-prompt.sh

# このDockerfileが存在するディレクトリにgit-prompt-sample.txtを作成し、.bashrcに記載したい内容を書いておく
COPY git-prompt-sample.txt /home/$USERNAME/git-prompt-sample
RUN cat git-prompt-sample >> .bashrc

# SSH鍵のコピー
COPY <秘密鍵のファイル名> /home/$USERNAME/.ssh/<秘密鍵のファイル名>
COPY <公開鍵のファイル名> /home/$USERNAME/.ssh/<公開鍵のファイル名>

# 以下を追加
# SSHに関するディレクトリ・ファイルの所有者・権限の変更
RUN sudo chown $USERNAME:$GROUPNAME /home/$USERNAME/.ssh
RUN sudo chown $USERNAME:$GROUPNAME /home/$USERNAME/.ssh/<秘密鍵のファイル名>
RUN sudo chmod 0600 /home/$USERNAME/.ssh/<秘密鍵のファイル名>
RUN sudo chown $USERNAME:$GROUPNAME /home/$USERNAME/.ssh/<公開鍵のファイル名>
```

追加したコマンドのうち、以下1行だけを追加してもwarningを消すとこはできます。
```Dockerfile
# /home/$USERNAME/.sshディレクトリの所有者を$USERNAMEにする
RUN sudo chown $USERNAME:$GROUPNAME /home/$USERNAME/.ssh
```

ですが、この場合はSSH鍵の所有者がrootのままになってしまい気持ち悪いので、念のため秘密鍵の所有者変更・権限変更、公開鍵の所有者変更を実施しています。
```Dockerfile
# 秘密鍵のファイルの所有者を$USERNAMEにする
RUN sudo chown $USERNAME:$GROUPNAME /home/$USERNAME/.ssh/<秘密鍵のファイル名>
# 秘密鍵のファイルは所有者による読み取り・書き込みのみ可能にする
RUN sudo chmod 0600 /home/$USERNAME/.ssh/<秘密鍵のファイル名>
# 公開鍵のファイルの所有者を$USERNAMEにする
RUN sudo chown $USERNAME:$GROUPNAME /home/$USERNAME/.ssh/<公開鍵のファイル名>
```

以上を追加することで、`git clone`時に表示されていたwarningが表示されなくなり、すんなりGitHubに接続できました。
```bash
// clone実行
$ git clone [リポジトリのURL]
Cloning into '[リポジトリ]'...

// 「yes」を入力
The authenticity of host 'github.com (20.27.177.113)' can't be established.
[秘密鍵] key fingerprint is [秘密鍵の内容].
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? 
> yes

// warningが発生しない(内容が安全である)
Warning: Permanently added 'github.com' (ED25519) to the list of known hosts.

remote: Enumerating objects: 687, done.
remote: Counting objects: 100% (687/687), done.
remote: Compressing objects: 100% (369/369), done.
remote: Total 687 (delta 335), reused 605 (delta 255), pack-reused 0 (from 0)
Receiving objects: 100% (687/687), 686.19 KiB | 1022.00 KiB/s, done.
Resolving deltas: 100% (335/335), done.
```



# まとめ
前回記事の時点でよく確認しておくべきでした... 失礼いたしました m(_ _)m