さくらのVPS に申し込んでDocker-composeをインストールし
Docker-composeでWordPressをインストール→テーマCocoonを入れるところまでやりました。
パソコンはWindows11。さくらVPSのOSはubuntu。
SSHは最初うまくいかなかった。(その後解決)
SSH接続しなくてもあらかじめ用意されているコンソールだけで何とかなりました。
勉強が目的なので2週間のお試しでやめました。(クレジットカードは必要)
(期限2週間の前の日に簡単にキャンセルすることができました。)
当記事ではWordPressのセキュリティ対策は、まったく考慮されていませんので、ご了承ください。
SSH公開鍵の準備
PowerShellを管理者権限で立ち上げC:\Users\ユーザー名(どこでもいいかも)へ移動
参考:SSH公開鍵認証の設定をしたい、SSH を利用したい
SSH公開鍵登録の詳細(Windowsの場合)
最初うまくいかなかったのですが、githubにPermission denied (publickey).でSSH接続できなかった。でSSHのログが見れることがわかりキーの名前(sshkey)がidentifyしている名前の中にないことが分かり解決にいたりました。
WindowsのPowerShellを管理者権限で立ち上げ
×ssh-keygen -t ed25519 -f sshkey ←これではキーのファイルの名前がsshkeyになってうまくいかなかった。
Windows11の場合、SSH接続するときにキーのファイルの名前が違うとうまくいかないみたいでした。
〇ssh-keygen -t ed25519←これだとキーのファイルの名前がid_ed25519になってうまくいく。
Enter passphrase (empty for no passphrase):任意のパスフレーズを入れる(SSH接続時に聞かれるので記録しておく)
Enter same passphrase again:同じパスフレーズを入れる
.sshの下に以下のファイルができます。
id_ed25519 (秘密鍵:端末にて保管)
id_ed25519.pub (公開鍵:サーバーに設置)
メモ帳にid_ed25519.pubにドラッグ&ドロップすると中身が見れます。
後でコピーして使います。
さくら申し込み
さくらのVPS 1G に申し込みます。
サーバー選択(ubuntu)
サーバーは以下のように選びました。
バージョンはプランを1G以上にすると22.04が選択できます。
リージョンは東京にしましたが、もしかしたら他のはマイナス*円となっているので、その分、安いのかも。
ネットで他の方のを見ると最初にSSH接続するとパスワード認証にいけてるようです。
なのでここはやらなければ最初のSSH接続でパスワード認証になるかもしれません。
追記:
と思ったんですが、OSがubuntuだと挙動が違うのかもしれません。
管理ユーザーは、ここを見るとubuntuの場合はrootではなくubuntuみたいです。
こちらも参考になります。
【第21回】ウイルス対策は必要?rootはなぜ無効?Ubuntuにおけるセキュリティのキホン
多分、ssh root@ホスト名を誰かが実行したら、あとはパスワードさえわかれば接続できてしまうのに対し
ubuntuの場合はssh ubuntu@ホスト名ではエラーになる。
つまりubuntuの場合は公開カギの設定をしない限りssh接続できないので、
パスワードさえわかれば接続できてしまうものに比べれば、
少しは安全だということだと思いました。(間違ってるかもしれない)
またUbuntuに、新規ユーザを追加する場合、コマンドが他と違うみたいです。
Ubuntuユーザ追加とsudo権限付与。ユーザ/グループ操作まとめ
「公開鍵をサーバーにインストールする」をクリックした上で作ってメモ帳で開いてコピーしたsshkey.pub(id_ed25519.pubを作っていればうまくいくかも)の中身を貼り付けます。
「公開鍵をコントロールパネルに追加する」のチェックはつけていません。
その後、「SSHキー管理」を見ると「追加済みのSSHキーがありません」と出ました。
登録されているけど表示されていないのか、登録されていないのか、よくわかりません。
支払い手続き
お支払方法選択へ→新規会員登録→メールアドレス入力→「個人情報の取扱いについて」に同意します。が良ければチェック→会員登録のご案内メールを送信→メールが送られてくるのでurlをクリック→会員情報を入力して会員登録→登録した電話番号に認証番号の連絡があるので伝えられた番号を入力して認証完了→VPS お申し込みページ へ進む→支払い方法と確認でカード追加→新しいクレジットカードを追加→クレジットカード登録が終わったら入力画面に戻って→セキュリティコード入力、2週間お試しを利用するを選択→お支払いを確定する
動かしてみる
サーバー一覧から自分のサーバーをクリック→電源操作タブで「起動する」
SSHの場合
WindowsのPowerShellでssh ubuntu@ホスト名
私の場合
PS C:\Users\user\sakura> ssh ubuntu@tk2-110-56065.vs.sakura.ne.jp
しかしエラー
ubuntu@tk2-110-56065.vs.sakura.ne.jp: Permission denied (publickey).
手動でSSHキーを登録します。
コンソールタブ→シリアルコンソールで
cd .ssh
vim authorized_keys
ここからはvimの使い方を調べて確認してください。
iでインサートモード
パソコンでメモ帳にid_ed25519.pubにドラッグ&ドロップし中身をコピー。
シリアルコンソールでshift+insertで張り付け
escでコマンドモード
:wqで保存して終了
ssh ubuntu@ホスト名 で接続
Enter passphrase for key 'C:\Users\user/.ssh/id_ed25519':ssh-keygenでカギを作った時に作ったパスフレーズを入れる
[sudo] password for ubuntu:となった場合は、さくらVPSの管理ユーザーのパスワード
目次へ
コンソールの場合
最初SSHがうまくいかないのでコンソールで2つ用意されているVNCコンソールとシリアルコンソールを使いました。
使っているとわかるのですが、両方とも不便です。
コンソールタブ→VNCコンソール→ユーザー名:ubuntuパスワード:管理ユーザーのパスワード
VNCコンソールは、コピペができなくて不便です。
VNCコンソールで+を入力するときは、キーボードの右側の+ではなくshift+’;’で入力しないとダメで来た。
コンソールタブ→シリアルコンソールにしました。Enterでコマンド入力可能になります。
こちらはこちらでコピペはできるけど60秒何もしないと会員ログインからやり直しになります。
Docker
DockerとDocker-composeをインストールしました。
DockerはUbuntu on さくらVPS に Docker Engine をインストールしてみたをそのままやりました。
Docker-composeは Docker と docker-compose をインストールするをやりました。
シリアルコンソールでやっていたのですが
sudo systemctl status docker実行後
lines 1-22/22 (END)の表示が消えなくなって先に進めません。
VNCコンソールにして続きをやりました。参考リンクはv2.22.0ですが、
そこをv2.24.0に変更して実行しました。
後に分かったんですが
シリアルコンソールで入力できなくなったら(ubuntu@***:~$が出なくなったら)
CTRL+Cで入力できるようになりました。
WordPress
DockerとDocker-composeがインストールできたのでWordPressを入れてみます。
ConoHa VPSでDockerを使う方法を参考に実行します。
以下は変更します。
ports:
- "8000:80"
↓↓↓↓
ports:
- "80:80"
パケットフィルターを設定しないとホストにブラウザでアクセスできないようです。
パケットフィルター設定→パケットフィルター設定を追加する→フィルターの種類をWEB→追加→設定を保存する。
サーバーのところでホスト名にあるドメインにアクセスするとWordPressが立ち上がります。
dockerコマンドを実行するときは冒頭にsudoを付けます。
Cocoonを入れようとすると
「辿ったリンクは期限が切れています。 もう一度お試しください。」が出ますが、
このリンクのところに対策方法書いてます。
具体的には
vim php.iniでファイルを作ります。
中身は
upload_max_filesize = 32M
post_max_size = 32M
保存したら
sudo docker cp ./php.ini <container_name>:/usr/local/etc/php/php.ini
<container_name>はsudo docker ps -aで調べられます。
sudo docker restart コンテナ名で再起動
目次へ
Git cloneしてみる
何もしていないがgitが入っているか確認
git --version
git version 2.34.1と表示されたのでgitは最初からインストールされている。
githubから以下でクローン成功した。
git clone https://アクセストークン@github.com/ユーザーname/レポジトリ名.git
githubのアクセストークンについては、こちらを参照してください。
セキュリティ対策
VPSやSSHについて調べてるとセキュリティ対策について色々出てくるのでやってみました。
ネットの情報は様々で、だいぶ苦労しました。
OSがubuntuであることとバージョンやインストールしているものなど環境によってだいぶ違うようです。
ネットの情報を元に自己解釈でやってみました。
SSH接続を新しいユーザーでやってみる
参考:Ubuntuに、新規ユーザを追加する
rootしかいないLinuxにユーザーを追加し、SSHをセットアップする
ubuntu@ホスト名でSSH接続して
新規ユーザー作成
sudo adduser hazuki(hazukiは今回追加するユーザー名)
New password: パスワード
Retype new password: パスワード
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] y
#ユーザに、sudo権限を付与する
sudo gpasswd -a hazuki sudo
#ユーザーをubuntuからhazukiに切り替える
su -l hazuki
でubuntu@ホスト名→hazuki@ホスト名に変わる。
#.sshディレクトリ作成
mkdir /home/hazuki/.ssh
# 公開鍵を登録する
echo "id_ed25519.pubの中身のテキスト" > /home/hazuki/.ssh/authorized_keys
# パーミッションをhazukiに変更
chown hazuki: /home/hazuki -R
これでssh hazuki@ホスト名でSSH接続できました。
しかしubuntuで作ったディレクトリはみれないので
パーミッション等を変更する必要がありそうです。
ということで元のubuntuユーザーを削除するのは、問題が出そうで、やめました。
目次へ
rootユーザーでのSSH接続を禁止 & パスワード認証を禁止
参考:【さくらVPS】SSH接続し、必要なセキュリティ対策を行う手順
rootユーザーのログインを禁止とパスワード認証を禁止の設定をしました。
(もしかしたら、元々動作せず、これは必要ないかもしれない。)
vi /etc/ssh/sshd_config
でsshd_configに以下2行追加。
PermitRootLogin no
PasswordAuthentication no
元々どうなっていたかviの場合jを押せば下の方にカーソルが移動して隠れている部分まで見えます。
以下のようにコメントアウトされていてデフォルトがどういう状態なのかは分かりません。
#PermitRootLogin prohibit-password
#PasswordAuthentication yes
sshdを再起動して設定を反映させる
sudo systemctl restart sshd
Port22変更
続いてSSH接続のport22を2000に変更
ubuntuでvi /etc/ssh/sshd_configを実行したら[Read only file]になっていて編集できない。
ubuntu@tk2-110-56065:/etc/ssh$ ls -l
でパーミッションを調べると
-rw-r--r-- 1 root root 1650 Feb 26 2022 ssh_config
管理ユーザーはwになっているので書き込めるはずだが、
ubuntuは管理ユーザーではないのか、1個前に編集したとき、何か変更したか忘れた。🤣🤣
取り合えずsudo chmod 664 sshd_configをやったが変わらないので644に戻した。
所有者がrootになっているのでubuntuに変えた。
(前はubuntuだった気がする。どこかでrootにかわった。)
sudo chown ubuntu:ubuntu sshd_config
ls -l
でパーミッションを調べると
-rw-r--r-- 1 ubuntu ubuntu 3299 Jan 27 08:18 sshd_config
vi /etc/ssh/sshd_configを実行したら
今度はSwap file "ssh_config.swp" already exists!がでたけど
eを押して取り合えず編集継続。
変更前:
#Port 22
変更後:
Port 2000
設定を反映させる。
sudo systemctl restart sshd
VPS側でパケットフィルター設定
カスタムTCP2000送信元IPアドレス:*.*.*.*/32の範囲で許可する(自分のIPだけにした)
ssh20の方は削除した。
カスタムでSSHが選べないのでTCPにして動いているが、それでいいのかは分かりません。
つなげてみる
ssh ubuntu@tk2-110-56065.vs.sakura.ne.jp
エラーになる
ssh: connect to host tk2-110-56065.vs.sakura.ne.jp port 22: Connection refused
パソコン側で22につなごうとしてる。
-p 2000を後ろに書いて以下でつながりました。
ssh ubuntu@tk2-110-56065.vs.sakura.ne.jp -p 2000
ファイアウォール
参考:https://zenn.dev/uchidaryo/books/ubuntu-2204-server-book/viewer/ufw
ufw(ファイアウォール)を有効にする。
sudo ufw enable
[sudo] password for ubuntu:
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
ubuntu@tk2-110-56065:~$
1回PowerShellを閉じて再接続するとエラーになる。
ssh ubuntu@tk2-110-56065.vs.sakura.ne.jp -p 2000
ssh: connect to host tk2-110-56065.vs.sakura.ne.jp port 2000: Connection timed out
ファイアウォールが効いている。
VPSのコンソールでport2000を許可する
sudo ufw allow 2000
[sudo] password for ubuntu:
Rule added
Rule added (v6)
これでSSH接続もできるようになった。
ちなみに上で追加したパケットフィルター設定port2000を削除したら
つながらなくなったので両方とも動作しているようです。
sudo ufw status numbered
でルール番号を確認し
sudo ufw delete [ルール番号]
で削除
sudo ufw allow from *.*.*.224 to any port 2000
でIP制限もできました。
参考:https://zenn.dev/devcat/scraps/5110fd243d0eea
目次へ
ufwでいろいろ実験
実験して分かったことを書いていきます。
参考:https://www.linuxmaster.jp/linux_skill/2009/02/linux-4.html
IPアドレス:の後ろがport番号ではなく文字列の謎
接続待ちをしているポートを確認する(ssコマンド)に
TCP情報のみ表示する-tを付けて実行(SSH接続状態で)
ss -t
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 私のさくら.VPS.のIP.アドレス:cisco-sccp 私の.パソコン側の.IP.アドレス:77777
Local Address:Portのポートがcisco-sccpになっているが調べると
2000番の別名みたいな感じだと思った。つまりport2000のことを指している。
他のコマンドでも:の後ろに数字ではなく文字列が書かれているのをよく目にする。
あまりこういう名前の付いたportは使わないほうがいいかもしれないが
自分の使っているシステムで利用しているサービスでなければ
多分使ってもいいんだろうなと思いました。
ufwを有効にした直後、SSH接続は接続できなくなったが、Docker+Nginxで作ったアプリはつながる謎
全てのソケットを表示
ss -a
たくさん表示されるのだがNetidがtcpになっているのが関係ありそうなので抜き出した。
たくさん表示されるのは、ソケットの説明を見ると外部との通信以外にIPC:プロセス間通信を表示しているのかもしれない。(しろうとなので、ソケットについてはよくわかっていません。)
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
略
tcp LISTEN 0 4096 0.0.0.0:8000 0.0.0.0:*
tcp LISTEN 0 128 0.0.0.0:cisco-sccp 0.0.0.0:*
tcp LISTEN 0 4096 0.0.0.0:http 0.0.0.0:*
tcp LISTEN 0 4096 0.0.0.0:81 0.0.0.0:*
tcp ESTAB 0 0 私のさくら.VPS.のIP.アドレス:cisco-sccp 私の.パソコン側の.IP.アドレス
tcp LISTEN 0 4096 [::]:8000 [::]:*
tcp LISTEN 0 128 [::]:cisco-sccp [::]:*
tcp LISTEN 0 4096 [::]:http [::]:*
tcp LISTEN 0 4096 [::]:81
sudo ufw status numberedで作ったルールを確認すると1個しかない。
Status: active
To Action From
-- ------ ----
[ 1] 2000 ALLOW IN 私の.パソコン側の.IP.アドレス
8000、http(80)、81が接続可能なのでは、この辺がLISTEN状態になっているからだと思われる。
0.0.0.0:8000、0.0.0.0:http 、0.0.0.0:81 、[::]:8000 、[::]:http 、[::]:81
([::]は多分ip6。違うかも)
これはufwでsudo ufw allowしたわけではなくDocker+Nginxで設定したものが、そのまま残っていると思われます。
0.0.0.0で大丈夫なのかと思いました。
Docker ymlで0.0.0.0になるように書いたんだと思います。
Wikipediaを見ると以下ようなことなので、
VPSの私のホストアドレス知っている人しか到達できないので
結局0.0.0.0のところに自分のホストアドレスを書くのと同じだと思いました。
そのうちDocker ymlで0.0.0.0をホストアドレスになるように実験してみるかも。
サーバにおいては、0.0.0.0は「ローカルマシン上の全てのIPv4アドレス」を意味する。ホストに192.168.1.1と10.1.2.1の2つのIPアドレスがあり、そのホストで実行されているサーバが0.0.0.0で待ち受けするように構成されている場合、どちらのIPアドレスに対しても到達可能になる。
https://ja.wikipedia.org/wiki/0.0.0.0
ポート80をufwで閉鎖してみる。
sudo ufw deny 80
ルールを確認するとちゃんと作られている。
sudo ufw status numbered
Status: active
To Action From
-- ------ ----
[ 1] 2000 ALLOW IN 私の.パソコン側の.IP.アドレス
[ 2] 80 DENY IN Anywhere
[ 3] 80 (v6) DENY IN Anywhere (v6)
しかしポート80にアクセスするとつながった。
ss -aで見るとポート80はDENYする前と変わらない。
tcp LISTEN 0 4096 0.0.0.0:http
なぜかは分からなかった。
パケットフィルターの80を削除したら、つながらなくなった。
その状態で、ufwの2、3番のルールをsudo ufw deleteで削除し
sudo ufw allow 80にしたがつながらない。
「パケットフィルターを利用しない」にしたらつながった。
の状態で、ufwの2、3番のルールをsudo ufw deleteで削除してもつながる。
sudo ufw deny 80でもつながった。
tcp LISTEN 0 4096 0.0.0.0:http
この状態だとufwのdenyではポートを閉じることができなかった。
LISTENはどうやったら消えるのか
8000番を使っているDockerのコンテナを停止したがLISTENのまま。
パケットフィルター設定を有効にする。
SSH接続はできなくなりコンソールで確認するとcisco-sccp(8000)はESTABのままになってる。
domain 0.0.0.0:*
tcp LISTEN 0 128 0.0.0.0:cisco-sccp 0.0.0.0:*
tcp LISTEN 0 4096 0.0.0.0:http 0.0.0.0:*
tcp LISTEN 0 4096 0.0.0.0:81 0.0.0.0:*
tcp ESTAB 0 0 私のさくら.VPS.のIP.アドレス:cisco-sccp 私の.パソコン側の.IP.アドレス
tcp LISTEN 0 128 [::]:cisco-sccp [::]:*
tcp LISTEN 0 4096 [::]:http [::]:*
tcp LISTEN 0 4096 [::]:81 [::]:*
sudo ufw deleteでport2000番を消して
sudo ufw deny 2000にしたがss -aで確認すると変わらない。
sudo ufw disable #ファイヤーウォールを無効にする。
sudo ufw enable #ファイヤーウォールを有効にする。
80番がつながらないのでsudo ufw allow 80をしたがつながらない。
パケットフィルターで80を設定するとつながる。
結局、ぐちゃぐちゃでよく分からなくなってしまいましたが
ufwでコントロールできるport(SSH接続で使った2000)もあれば、
できないport(Docker+Nginxで使ってる80、81、8000)もある状態でした。
またパケットフィルターがufwよりも支配的でした。
ufw、パケットフィルター、Docker+Nginxの関係とLISTENが
どういう状態を意味するのか勉強する必要がありそうです。
目次へ
/var/log/ufw.logがない謎
ufwのログはufw.logに書かれるようですが、見つかりません。
出力されるようにいろいろ試しましたが結局、できませんでした。
ログは別のファイルにも書かれているようなので、そちらを利用する方向で進みます。
こちらhttps://ja.linux-console.net/?p=15718を参考に別のファイルに書いてあるログは以下で見れた。
grep -i ufw /var/log/syslog
しかし[UFW BLOCK]しか見れない。[UFW ALLOW]がまったくない。
こちらhttps://www.gadgets-today.net/?p=4754を参考にして
sudo ufw logging high
にすると [UFW AUDIT]が出た。この意味はこちらが参考になります。https://blg.mu2chn.net/posts/adx5md/
しかし2000番以外に80、81、8000が見当たらないので
grep -i 調べたい文字列 /var/log/syslogの形式で
調べたい文字列に80、DPT=80、SRC=自分のIPなどいろいろ調べたが
いずれもport80などにアクセスしたログを発見することはできなかった。
DockerのNginxのコンテナの中に入ってlogを確認するには
sudo docker logs コンテナID
でログが見れます。
目次へ
ポートはiptablesがコントロールしてるのか?
加筆:
仮想マシンという視点が抜けていた。
OSインストールしたり、起動、停止したりしている管理画面は仮想マシンを操作している。
つまり私は仮想マシンを借りている状態。
ここで見ているiptablesやufwなどは仮想マシンの中の設定。
「パケットフィルターを利用する」などの設定は仮想マシンの外の設定で
中のiptablesには反映されないものと思われます。
https://blg.mu2chn.net/posts/adx5md/に”そもそもufwはiptablesを操作するためのコマンドで、”ということなのでiptablesについて調べるとファイアウォールiptablesを簡単解説~初心者でもよくわかる!VPSによるWebサーバー運用講座(4)にたどり着いた。
iptablesの設定状況を確認してみる
sudo iptables -nL
表示結果の中で関係ありそうなのが以下
Chain DOCKER (3 references)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 172.26.0.5 tcp dpt:81
ACCEPT tcp -- 0.0.0.0/0 172.26.0.5 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 172.27.0.2 tcp dpt:8000
Chain ufw-user-input (1 references)
target prot opt source destination
ACCEPT tcp -- パソコン側の.IP.アドレス 0.0.0.0/0 tcp dpt:2000
ACCEPT udp -- パソコン側の.IP.アドレス 0.0.0.0/0 udp dpt:2000
ポートの開閉状態の設定は、ここをみればよさそうだ。
ufwで80番をDENYにしたら上のChain DOCKER (3 references)は何も変わらず。
下の部分に追加された。この状態では80番はつながる。
「パケットフィルター利用しない」の状態。
Chain ufw-user-input (1 references)
target prot opt source destination
ACCEPT tcp -- ***.***.***.*** 0.0.0.0/0 tcp dpt:2000
ACCEPT udp -- ***.***.***.*** 0.0.0.0/0 udp dpt:2000
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
DROP udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:80
次にこのルールを消して「パケットフィルターを利用する」にしてみる。
予想に反して、iptablesには変化はなかった。
「パケットフィルターを利用する」にすると全ポートがオフになるようだが、
iptables以外のところで、その設定が反映されるっぽい。
さくらVPSのパケットフィルターとiptablesの関係がよく分からないです。
ここまで見てくると「パケットフィルターを利用する」にして
都度パケットフィルターを追加するのがいいかと思いましたが、
下のようなご指摘もあります。
さくらのVPSのパケットフィルターは無効化した方が良い理由
Dockerを使っていることも考慮して
結局、どうすればいいか個人的には結論には至りませんでした。
後でじっくり読むけどports – セキュリティに関する留意点は参考になりそうです。
目次へ
2週間のお試し期間が終了前にキャンセル
やり方は会員登録・契約内容の確認・変更に書いてあります。
念のため1日前に『申込を取消』(キャンセル)しました。
しばらくは使えてますが、その後つながらなくなります。
メールで以下のように来ます。(抜粋)
請求書NO:***** はお支払い不要でございます。
銀行振込をご選択の方 :請求メールは破棄ください。
請求書払いをご選択の方 :請求書(書面)は破棄下さい。
行き違いでお届けとなる可能性もございます。
クレジットカード払いをご選択の方:クレジット決済は行われません。
ということで無料で2週間使わせていただきました。
目次へ
まとめ
SSH接続できなくても何とかできたが、非常に不便です。
SSH接続は苦労しながらもトライするとLinux等の勉強になる。
2週間の無料期間、さくらのVPS 様、ありがとうございました。
SSH接続を初めて使って思ったんだが、
パソコンで作った公開鍵が流出したらパソコンにSSH接続されてファイルを
いじられることはないのか、ちょっと心配になった。
目次へ
イチゲをOFUSEで応援する(御質問でもOKです)Vプリカでのお支払いがおすすめです。
MENTAやってます(ichige)
コメント