開発環境としてのQNAP NASが好きです。
QNAP NASにはContainer StationというDockerなどのコンテナをGUIから用意に扱うためのアプリが用意されており、マウスでポチっとするだけで簡単にUbuntuが立ち上がります。本当に簡単。
ただ、macなどからリモート開発するために、チロっと設定が必要で、毎回「どうだっけ?」となるので、備忘録としてQNAPのDocker on UbuntuにリモートPCからSSH接続するまでの手順を記します。
環境:
- QNAP NAS:TS-253D
- OSバージョン:4.5.1
- Container Station:2.2.14
- Ubuntu:20.04
Container StationでUbuntuコンテナ作成
リモート開発用にコンテナにIPアドレスを振り分けたり、コンテナにわかりやすいホスト名を設定するTipsを紹介します。Container Stationは数クリックでDockerコンテナが立ち上がり、本当に使いやすいインターフェースを備えています。
UbuntuのDockerコンテナ作成
Container Stationを起動し、左部メニューから「作成」をクリックします。
Dockerイメージの取得
①検索窓に「ubuntu」と入力し虫眼鏡マークをクリック
②タブメニューから「Docker Hub」をクリック
③表示されたDokcerイメージから公式のものを選び「インストール」をクリック
Ubuntuのバージョンを指定
Ubuntuの希望のOSバージョンを選択。
Dockerコンテナの詳細設定
「名称」部に希望のコンテナ名を入れ「詳細設定」をクリック
①メニューから「ネットワーク」を選択
②コンテナの希望のホスト名を入力(コンテナログイン時にユーザー名@ホスト名と表示される)
③ネットワークモードを「Bridge」に変更
④「静的IPを使用する」を選択
⑤IPアドレスを設定(実際には192.168.11.xxxのxxxの部分を自由に決めます)
上記設定が済んだら「作成」を押し、コンテナを作成します。
ここで設定したIPアドレスは覚えておきます。外部からSSH接続する際に必要になります。
DockerのUbuntuコンテナにSSH接続する手順
Ubuntuコンテナが作成出来たら、次はmacやwindowsなどのリモートPCからUbuntuにSSH接続する設定を入れます。これでリモートPC上で、まるで自分のPCにアプリの開発環境があるかのようにプログラミングできますね^^
Ubuntuコンテナのターミナル(コンソール)を開く
上図のコンテナ名をクリックし、作成したUbuntuコンテナのターミナル(Container Stationでは”コンソール”と呼ばれる)を開きます。
以下はターミナル(コンソール画面)内でのコマンド操作になります。
Ubuntuにユーザーを作成する
ルートユーザーのまま開発するのが一番楽なのですが(アクセス権限関係もろもろ)、開発時になんでもできてしまうユーザーは怖いですね。Dockerの中の話ではありますが、コンテナ外からアクセスするための開発専用ユーザーを作っておきます。
下記コマンドで新しいユーザーが作成されます。<user_name>の部分は好きな名前で。
新規ユーザー作成中、パスワードが2回聞かれるので忘れないようにします。他の項目はエンター連打で良いでしょう。
adduser <user_name>
つづけて新しく作ったユーザーにsudo権限を付与。コマンドの意味は”<user_name>ユーザーをsudoグループに追加する”となります。
gpasswd -a <user_name> sudo
これで、<user_name>ユーザーは、必要なときにコマンドにsudoをつけて、ルートの権限を借りることができます。
sudoコマンドのインストール
続いてsudoコマンドをインストールします。新規で作ったUbuntuコンテナではsudoが使えませんでしたので、下記コマンドによりsudoを追加します。
apt install sudo
vimのインストール
次に、後々の設定変更で必要になるエディター「vim」をインストールします。
apt install vim
新規ユーザーでログイン
login <user_name>
上記コマンドでパスワードが聞かれ、ユーザー作成時のパスワードを入力すると、ユーザーでログインできます。
SSHサーバーインストール
sudo apt install openssh-server
※ルートユーザーでは無いのでsudoが要ります。
※インストール中、”使用地域”を確認されますので適宜入力します。
openssh-server はSSH接続される側(Webサーバーなど)に追加するアプリケーション。このアプリに設定を加え、サービスとして起動することで、外部からSSH接続できるようになります。
SSHサーバーの設定
SSHサーバーはインストールしただけでは機能しません。
適切な設定を入れ、サービスを起動して初めて外部から接続できるようになります。設定の編集は先ほどインストールしたvimを使います。
sudo vim /etc/ssh/ssh_config
上記コマンドを叩くと、SSHサーバーの接続設定画面が現れます。
Host *
# ForwardAgent no
# ForwardX11 no
# ForwardX11Trusted yes
PasswordAuthentication yes
# HostbasedAuthentication no
# GSSAPIAuthentication no
# GSSAPIDelegateCredentials no
# GSSAPIKeyExchange no
# GSSAPITrustDNS no
# BatchMode no
# CheckHostIP yes
# AddressFamily any
# ConnectTimeout 0
# StrictHostKeyChecking ask
# IdentityFile ~/.ssh/id_rsa
# IdentityFile ~/.ssh/id_dsa
# IdentityFile ~/.ssh/id_ecdsa
# IdentityFile ~/.ssh/id_ed25519
Port 22
# Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc
# MACs hmac-md5,hmac-sha1,umac-64@openssh.com
# EscapeChar ~
# Tunnel no
# TunnelDevice any:any
# PermitLocalCommand no
上記ファイルの「PasswordAuthentication yes」と「Port 22」のコメント「#」を外し、上書き保存します。
vimの操作方法はこちらのサイトがわかりやすいです。
SSHサーバーの起動
service ssh start
このコマンドでSSHサーバーが起動。外部からアクセスできるか確認してみます。
macやwindowsなどのターミナルから、
ssh <user_name>@Ubuntuコンテナのipアドレス
と打ってパスワードが聞かれ、ログインできればひとまずSSH接続は完了。
実際には、以下のようなコマンドになるかと。
ssh user@192.168.11.201
QNAPやUbuntuコンテナを再起動した場合は、SSHなどのサービスがダウンしていることがあるので、落ちていれば都度Container Stasionのコンソールから起動します。
SSH接続のセキュリティ設定
さて、上述の設定までで、一通りリモート開発の準備はできたわけですが、今の状態はセキュリティの懸念があります。
QNAP内のDockerへのSSH接続を許可している状態がセキュリティ上どれくらい危険なのかわかりかねますが、「QNAPは基本的に外部とつながっている」ことを考えると、パスワード一本で侵入される状態は気持ちの良いものではありません。
クセとして、
”SSH接続は公開鍵認証を使い、パスワードログインは不可”
としたいですね。面倒ですが設定を入れていきます。
公開鍵認証とは
サーバーとリモートPCの間を特別な認証方式(公開鍵)を設定し、サーバー/リモートPCそれぞれに設定した組み合わせのみ接続を許可する仕組み。パスワード認証よりセキュリティが高まるとされている。
公開鍵用ディレクトリ作成(Ubuntuコンテナ側)
まず、Ubuntuコンテナに作成したユーザーでログイン。Container Stationのコンソールからでも、macなどのリモートPCからでもOK。
コンソール画面上で
mkdir .ssh
とコマンドを入力し、ユーザーのhomeディレクトリに「.ssh」ディレクトリを作成。このディレクトリ内に公開鍵の設定を入れていきます。
公開鍵用ディレクトリ作成〜公開鍵作成(リモートPC側)
次はmacやwindowsなど、Ubuntuコンテナに接続する側のPCでの作業。
ターミナルを開き
mkdir .ssh
で公開鍵認証用ディレクトリを作ります。
次に
cd .ssh
ssh-keygen -t rsa
として、作成した「.ssh」ディレクトリに移動後、公開鍵認証用の”秘密鍵”と”公開鍵”のセットを生成します。
続けて下記コマンドで作成した公開鍵をUbuntuコンテナにコピーします。
scp ~/.ssh/id_rsa.pub <user_name>@192.168.11.201:~/.ssh/
ここではまだパスワードが聞かれると思いますので、ログインユーザーのパスワードを入力します。
<user_name>は作成したユーザー。IPアドレスはUbuntuコンテナ作成時に設定した静的IPです。SSHログインするときと同じですね。
公開鍵の設定(Ubuntuコンテナ側)
リモートPCから受け取った公開鍵を、公開鍵認証に使用するキーとして下記コマンドで設定します。
cd .ssh //.sshディレクトリに移動
cat id_rsa.pub >> authorized_keys
「authorized_keys」ファイルが無事作成されれば、もう公開鍵(id_rsa.pubファイル)は不要なので下記コマンドで削除しておきます。
rm id_rsa.pub
リモートPCの別のターミナルからUbuntuコンテナにSSH接続し、パスワードが聞かれずにログインできることを確認します。
さて、ここまでくれば公開鍵認証を用いたSSH接続が可能になっているはずです。
SSHの設定(Ubuntuコンテナ側)
公開鍵認証でのSSH設定は完了ですが、現状の設定は「パスワードログイン」も許可になっています。
UbuntuコンテナのSSH設定を変更します。
sudo vi /etc/ssh/ssh_config
上記コマンドを叩くと、vimエディターにてSSH設定ファイルが開きます。下記項目の「PasswordAuthentication yes」をコメントアウト (行頭に「#」付与)します。
Host *
# ForwardAgent no
# ForwardX11 no
# ForwardX11Trusted yes
PasswordAuthentication yes //この行をコメントアウト
# HostbasedAuthentication no
# GSSAPIAuthentication no
# GSSAPIDelegateCredentials no
# GSSAPIKeyExchange no
# GSSAPITrustDNS no
# BatchMode no
# CheckHostIP yes
# AddressFamily any
# ConnectTimeout 0
# StrictHostKeyChecking ask
# IdentityFile ~/.ssh/id_rsa
# IdentityFile ~/.ssh/id_dsa
# IdentityFile ~/.ssh/id_ecdsa
# IdentityFile ~/.ssh/id_ed25519
Port 22
# Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc
# MACs hmac-md5,hmac-sha1,umac-64@openssh.com
# EscapeChar ~
# Tunnel no
# TunnelDevice any:any
# PermitLocalCommand no
これでパスワードからのログインは不可となります。
念の為UbuntuコンテナのSSHサーバーを再起動しておきます。
sudo service ssh restart
エイリアスの設定(リモートPC側)
あとひと手間✋
リモートPCからUbuntuコンテナにSSH接続する際のエイリアス(ショートカットのようなもの)を設定します。この設定をしておくとVSCodeなどのエディターからUbuntuコンテナ上のファイルをリモート編集する際に簡単にSSH接続できるようになります。
mac等のターミナルで「.ssh」ディレクトリ内にconfigファイルを作成します。(configファイルの作成はvscode等のエディターでもかまいません)
vi .ssh/config
configファイルの内容はこのようにします。
Host my-ubuntu //SSH接続名、自由に決められる
HostName 192.168.13.70 //UbuntuコンテナのIPアドレス
Port 22
User <user_name> //ログインユーザー名
IdentityFile ~/.ssh/id_rsa
これでエイリアスが設定され、macなどのターミナルから
ssh my-ubuntu
と打つだけで、DockerのUbuntuコンテナに公開鍵認証でのSSH接続が可能となります。VSCodeのRemote SSHプラグインでも上記で設定したSSH接続先としてmy-ubuntuが表示されるようになります。便利ですね^^
ここまでが、Container StationのDockerコンテナに安全にSSH接続する一連の操作になります。お疲れさまでしたm(_ _)m
本稿で使用したQNAP NASの特徴
本稿で、アプリ開発環境として使用しているQNAP NASは「TS-253D」というシリーズです。
TS-253DはDocker利用に有利な以下のようなスペックを備えており、開発用サーバーとしてかなり重宝しています。(macのローカルストレージがひっ迫しているので・・・)
- CPU Intel® Celeron® J4125クアッドコア2.0 GHzプロセッサ
- CPUアーキテクチャ 64ビットx86
- システムメモリ 4 GB SO-DIMM DDR4(最大8GB)
- ドライブベイ 2 x 3.5インチ SATA 6Gb/s、3Gb/s
- 2.5 ギガビットイーサネット 2ポート (2.5G/1G/100M)
QNAPのNASには、Intel以外のCPUを積んだモデルもありますが、Dockerコンテナで使用するOSイメージが「x86」などのintel CPUにしか対応していな場合も多く環境構築時にハマります。(ラズパイでDocker使った時にはハマりました)
その点、TS-253Dのようにitenl CPUを積んだモデルは、安心してDockerのOSイメージを選定できました。
また、メモリが自分で増設できるのも👍
Dockerでwebアプリをいくつ起動するような使い方では、初期の4GBメモリでは心許ないですからね。(QNAPの純正アプリではContainer Stationの起動が必須のものもあり、メモリは以外と食うのです)
2ドライブ仕様ですので、2台のハードディスクでデータの冗長設定もしておけば、QNAPを家族の写真フォルダなどに利用していても安心^^うちはそんな使い方です。
コメント