f13: xserver vps + ubuntu + ssh + python

.
---

### **[ おまとめ ]**

xserver vps を契約したので、設定メモです

**(01) 前提事項**
**(02) teraterm にて ssh 接続**
**(03) 一般ユーザーの作成**
**(04) 一般ユーザーでの ssh 設定**
**(05) sshd_config の設定**
**(06) port No. 変更**
**(07) その他の設定**
**(08) ftp 接続**
**(09) python / pip の設定**
**(10) cron の設定**
**(11) イメージ バックアップ**

---

### **[ 1. キッチン ]**

　**・Xserver VPS / 2GB プラン**
　　**-> Ubuntu 22.04 (64bit)**

　**・Windows10 64bit pc**
　**・Tera Term Pro version 2.3**

---
### **[ 2. 調理 ]**

**---- (01) 前提事項 -------------------------**

**[ VPS パネル ]** にて、以下設定をしておきます

**・OS -> Ubuntu 22.04 を選択**
**・root パスワード設定**
**・SSH Key の登録、xxxx.pem キーファイルの保存**
**・接続許可ポート: SSH(22) ON にする**
**・電源操作: 起動**

**・ひとまずの ssh 接続 + ssh key の設定**

　電源操作 の左にある **「コンソール」** より
　root にて接続し、以下 sshd_config の編集

```bash:
　・現在の設定確認
　# cat /etc/ssh/sshd_config
```
```bash:
　・念のため、現在の設定のバックアップ
　# cd /etc/ssh/
　# cp -R sshd_config sshd_config_bk1
```

```bash:
　# vi /etc/ssh/sshd_config

　以下 2つを有効にする (　# を外す　)
　PubkeyAuthentication yes
　AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2  

　ssh 設定反映
　# service sshd reload
　ssh リスタート
　# /etc/init.d/ssh restart
```

.
**---- (02) teraterm にて ssh 接続 -----------**


・Host: 付与されたグローバルIP
・Service: SSH
・TCP port: 22

・User name: root
・Passphrase: 空(入力なし)

　ちょっとうる覚えですが、初期段階では確か、
```bash:
　/etc/ssh/sshd_config
　PermitRootLogin prohibit-password
　PasswordAuthentication no
```
　となっておりますので、設定した root パスワードは、
　入力しても無効ですが、
　以下 xxxx.pem にてログイン可能となります

・Use RSA/DSA/ECDSA/ED25519 key to login:
　ダウンロードした xxxx.pem ファイルを指定

.
**---- (03) 一般ユーザーの作成 ---------------**

※ ユーザー名は、abcd としてます
```bash:
　・ユーザーの追加
　# useradd abcd
```

```bash:
　・ユーザーのパスワード設定
　# passwd abcd
```

```bash:
　・sudo の設定
　# usermod --append -G sudo abcd
```

```bash:
　・home ディレクトリの作成
　# cd /home
　# mkdir abcd
```

```bash:
　・パーミッションの設定
　# chown abcd:abcd abcd
　# chmod 755 /home/abcd
```

```bash:
　・確認
　# ls -lah
```

.
**---- (04) 一般ユーザーでの ssh 設定 --------**

ユーザーのホームディレクトリに「.ssh」というディレクトリ作成し、
パーミッションを「700」に設定します

```bash:
　# cd /home/abcd
　# mkdir .ssh

　# chown abcd:abcd .ssh
　# chmod 700 .ssh

　・確認
　# ls -lah
```

root で使用している authorized_keys を
ユーザー側にも複製し、パーミッションを「600」に設定します
(本来は個別で ssh key を作成したほうが良いのかもしれません)

```bash:
　# cd /root/.ssh/
　# cp -R authorized_keys /home/abcd/.ssh/

　# cd /home/abcd/.ssh/
　# chown abcd:abcd authorized_keys
　# chmod 600 /home/abcd/.ssh/authorized_keys

　・確認
　# ls -lah
```

.
**---- (05) sshd_config の設定 ---------------**

```bash:
　・現在の設定確認
　# cat /etc/ssh/sshd_config

　・念のため、現在の設定のバックアップ
　# cd /etc/ssh/
　# cp -R sshd_config sshd_config_bk2

　# vi /etc/ssh/sshd_config

　(root ログインの禁止)
　PermitRootLogin no

　(ssh キーファイル authorized_keys2 削除、しなくても大丈夫です)
　AuthorizedKeysFile .ssh/authorized_keys

　(パスワードによる ssh 接続の禁止、おそらく 初期値で no になってます)
　PasswordAuthentication no 

　(一般ユーザーの ssh 接続許可)
　AllowUsers abcd

　ssh 設定反映
　# service sshd reload
　ssh リスタート
　# /etc/init.d/ssh restart

　exit
　-> 一旦 teraterm を終了
```


これで、ひとまず一般ユーザーでの 
ssh ログインが可能になります


**※ ご注意！**
　記憶では teraterm で、ssh 接続中でも、
　/etc/ssh/sshd_config の編集・反映は、できましたが、
　( おそらく次回起動分からの有効、違ってたらすみません )
　設定変更により、ssh 接続ができなくなった場合は、
　[ VPS パネル ] 「コンソール」より
　root ないしは、作成されたユーザーで接続し、
　ssh 設定を元に戻すことになります

```bash:sshd_config リストア例
　$ cd /etc/ssh/

　・sshd_config_bk のバックアップファイルが存在することを確認
　$ ls -lah

　・sshd_config の削除 (いきなり消えますのでご注意)
　$ sudo rm -rf sshd_config

　・バックアップファイルからの戻し
　$ sudo cp -R sshd_config_bk sshd_config

　ssh 設定反映
　$ sudo service sshd reload
　ssh リスタート
　$ sudo /etc/init.d/ssh restart
```

　これは、以降の Port No. 変更にて
　ssh 接続ができなくなった場合も、同様になります

.
**---- (06) port No.変更 ---------------------**

[ VPS パネル ] 接続許可ポート のメニュー
の表記 SSH(22) からも分かるとおり、
xserver vps では、ssh ポートは、22 固定となっております

ですので、/etc/ssh/sshd_config の
#Port 22　を　Port 22 と有効にし、
Port 2000 などと変更しても、
ssh 接続は time out となり接続できません

ですので、port No. の管理および、変更は、
**ubuntu のファイアウォール (ufw) 側**で制御します

(今回の方法では、ssh 以外のポートも 
[ VPS パネル ] 接続許可ポート機能を使用せず、
ufw で追加許可していく形になります)


※ ssh の Port No. は、
　well known port 以外で、3003 としてます


**A. [ VPS パネル ] 接続許可ポート メニューにて
　全て許可 -> ON にします**

**B. 一般ユーザーにて ssh ログインし、
　ファイアウォール (ufw) 設定をします**

```bash:
　ufw ステータス確認
　$ sudo ufw status
　Status: inactive -> 未稼働

　IPv6 を無効化(必要の際は)
　$ cat /etc/default/ufw
　$ sudo vi /etc/default/ufw
　IPV6=no

　ファイアウォールを有効にする
　$ sudo ufw enable

　「deny（ホワイトリスト）」形式とするため、全拒否にします
　$ sudo ufw default deny

　現存接続を維持するため、22 と、切り替え予定の 3003 を許可します
　$ sudo ufw allow 22
　$ sudo ufw allow 3003

　ufw 再読み込み
　$ sudo ufw reload
　-> ファイアウォールを再読込しました
```

```bash:
　設定内容の確認
　(ルール番号を表示する「numbered」オプションを付けます)
　$ sudo ufw status numbered
　Status: active
　     To     Action      From
　     --     ------      ----
　[ 1] 22    ALLOW IN    Anywhere
　[ 2] 3003  ALLOW IN    Anywhere
```

```bash:
　特定のIPアドレスのみ通信を許可する
　$ sudo ufw allow from xxx.xxx.xxx.xxx to any port 3003
```
などを行うとさらにセキュリティ強化になります


**C. ssh_config の port No.変更**

```bash:
　・現在の設定確認
　$ cat /etc/ssh/sshd_config

　デフォルト値は #Port 22
　-> # で無効扱いになっているものの、22 で機能してます

　・念のため、現在の設定のバックアップ
　$ cd /etc/ssh/
　$ sudo cp -R sshd_config sshd_config_bk3

　・22 -> 3003 へ変更
　$ sudo vi /etc/ssh/sshd_config
　Port 3003

　ssh 設定反映
　$ sudo service sshd reload
　ssh リスタート
　$ sudo /etc/init.d/ssh restart

　exit
　-> 一旦 teraterm を終了
```

**D. 変更後の port No. で ssh 接続を確認**

-> これで、ssh の指定 Port No. での接続が可能になります
-> 無事接続が確認できましたら、No.22 を削除します
```bash:
　・ 設定を確認(削除前)
　$ sudo ufw status numbered
　Status: active
　     To     Action      From
　     --     ------      ----
　[ 1] 22    ALLOW IN    Anywhere
　[ 2] 3003  ALLOW IN    Anywhere

　・ [ 1 ] の 22 を削除
　$ sudo ufw delete 1

　・ 設定を確認(削除後)
　$ sudo ufw status numbered
　Status: active
　     To     Action      From
　     --     ------      ----
　[ 1] 3003  ALLOW IN    Anywhere
```

今回は、ssh 指定 Port No. のみの許可ですので、
その他のポートもお好みで ufw で追加許可します

.
**---- (07) その他の設定 ---------------------**

**E. コンソール 設定**

ubuntu + teraterm/ssh で不便になっている
以下を快適にします

```bash:
　E1. 十字キー/TABキー 入力補完

　$ cat /etc/passwd
　abcd:x:1001:1001::/home/abcd:/bin/sh

　デフォルトのシェル /bin/sh を /bin/bash に変更
　$ sudo chsh -s /bin/bash abcd
```
-> 変更した段階ではまだ sh のままなので、
　 以下の bash コマンド ($ source) を使用する前に、
　 一旦、exit で抜けて、再度 ssh ログインして 
　 bash の利用を可能にしておきます

```bash:
　E2. コンソールの日本語表示を英語にする
　(ユーザー環境変数ファイル作成)

　( .bashrc 作成)
　$ cd /home/abcd/
　$ touch .bashrc
　$ chmod 644 .bashrc

　(英語固定表記 [export LANG=en_US] を追記保存)
　$ sudo vi .bashrc
　export LANG=en_US

　( .bash_profile も複製)
　$ cp -R .bashrc .bash_profile

　(更新を反映させる)
　$ source .bashrc
　$ source .bash_profile
```

**F. zip ツール**

何かと要りようなので、入れておきます
```bash:
　$ sudo apt update
　$ sudo apt install zip
　$ sudo apt install unzip
```

.
**---- (08) ftp 接続 -------------------------**

上記 (6) までの ssh 設定、接続が完了してましたら、
filezilla などで、
sftp / IP / ssh 指定 Port No.
作成したユーザーID + xxxx.pem (ssh キーファイル)

にて接続ができます

.
**---- (09) python / pip の設定 --------------**

xserver vps の ubuntu 22.04 で
インストールされている python は、
ver 3.10.6 で、特に不便はないので
このまま使用します

pip はインストールされてませんので、
設定していきます

```bash:
　$ /bin/python3 --version
　Python 3.10.6

　$ /bin/python3.10 --version
　Python 3.10.6

　$ which python3
　/usr/bin/python3

　$ which python3.10
　/usr/bin/python3.10

　$ which pip -> なし
　$ which pip3 -> なし

　(pip のインストール)
　$ sudo apt update
　$ sudo apt install python3-pip

　$ which pip
　/usr/bin/pip

　$ which pip3
　/usr/bin/pip3

　(pip パッケージデフォルトモジュールの確認)
　$ pip list

```
あとは、お好みの pip を入れて完了です

```bash:
$ /usr/bin/python3 /home/abcd/test/test01.py
```

こんな感じで実行できます

.
**---- (10) cron の設定 ----------------------**

上記 (09) で確認した python の自動実行を
設定してみます

crontab コマンドは、
crontab -r で削除されてしまうから使ってはダメです
/etc/crontab（ファイル）を使用しなさい
などと言われておりますが、

・ユーザー単位で使用したい
・消えても再設定する

ので、crontab コマンドを使用します

※ ビジネス現場での使用の場合は考慮してください

　ちなみにこのような回避をされる方もいらっしゃいます
　危険な crontab -r を封印する
　https://qiita.com/kawaz/items/1620300551b5b3f2eccc

**G. 設定エディタの選択**

crontab コマンド初回実行時、編集を行うエディタの選択画面が
表示されます

```bash:
　Select an editor.  To change later, run 'select-editor'.
　1. /bin/nano <---- easiest
　2. /usr/bin/vim.basic
　3. /usr/bin/vim.tiny
　4. /bin/ed
```

お好みの エディタの番号を入力して Enter を押します
私は 2. vi にしましたが、
選択を間違えた場合は、いつでも
```bash:
$ select-editor
```
で、変更できます


**H. ログ出力 の追加**

python ロジック内で、cron 実行結果ログに出力される
標準出力(stdout)、エラー出力(stderr) の記述をしておきます
-> print('xxxx') のことです

```python:sample1.py
import datetime
now1 = datetime.datetime.now()
now2 = '{0:%Y/%m/%d %H:%M:%S}'.format(now1)

aaa = 0

if aaa == 1:
	print(now2 + ': OK')
else:
	print(now2 + ': NG')
```


```python:sample2.py
import datetime
now1 = datetime.datetime.now()
now2 = '{0:%Y/%m/%d %H:%M:%S}'.format(now1)

ccc = ''

try:
	bbb()
	ccc = 'OK'
except Exception as e01:
	ccc = 'NG: ' + str(e01)

print(now2 + ': ' + ccc)
```

次に、ログファイルを作成しておきます
```bash:
　$ cd /home/abcd/test/
　$ mkdir log
　$ chmod 705 log
　$ cd log
　$ touch test01.log
　$ chmod 604 test01.log
```


**I. crontab の設定**

[設定例]
・毎日 22:10pm に実行されます
・cron にて test01.py が実行され、
　./log/test01.log に実行結果ログが出力されます


```bash:
　$ crontab -u abcd -e
```

(選択したエディタが起動されます)
(以下を追記して保存します)

```bash:
　10 22 * * * /usr/bin/python3 /home/abcd/test/test01.py >> /home/abcd/test/log/test01.log 2>&1
```

```bash:
　確認
　$ crontab -l
```

.
**---- (11) イメージ バックアップ ------------**

xserver vps では 50GB までの
イメージ保存領域が利用できます

> 保存したイメージはOS再インストールや
> 新しいサーバーの作成に活用できます

とのことで、各種設定が終わりましたら、念のため
イメージバックアップ保存をしておいたほうが良いです

ちなみに、上記設定後のバックアップで、
4.93GB 使用となりました

---

### **[ 3. 食感 ]**

**※1 取り急ぎの実行環境の作成になります、
　 その他のセキュリティ設定は別途行ってください**

**※2 ちなみにドメイン未設定での記事になります**

**※3 ほぼ ubuntu の設定ですので、[ VPS パネル ] での設定以外、
　他社 vps と似たような感じでいけると思います**

**※4 今回こちらで確認した環境設定ですが、
　 使用環境やバージョンにより必ず同じ環境にはならないかもしれません
　 失敗しましたら、vps の醍醐味である、
　 OS 再インストールを行ってリトライしてみてください**

---
.