aokirozin's log

技術と音楽とアニメと読書の健忘録

さくらのVPSのSSH設定 (公開鍵認証)

環境

クライアント側

  • Windows 10
  • Tera Term
  • WinSCP
  • 適当なテキストエディタ

サーバ側

  • さくらのVPS
  • CentOS 7

やること

SSHの接続を公開鍵認証方式にして、接続ポート番号を22→50022に変更します。

  • パケットフィルタで新規ポート追加
  • ファイアウォールで新規ポート追加
  • SELinuxで新規ポート追加
  • sshd_configの設定変更
    • SSH接続ポート番号変更
    • 認証方式を公開鍵認証に変更
    • その他セキュリティ向上
  • 不要ポートの設定削除

まずは初期設定で接続

OSインストール時に設定したパスワードで、ポート22番にrootユーザで接続できるか確認します。サーバのIPアドレスは、さくらのVPSのコントロールパネルのサーバ→ネットワーク情報のアドレス欄からコピーできます。Tera Term でも WinSCP でも接続できることを確認します。

パケットフィルタの設定変更

カスタムOSインストールでCentOSをインストールしたので、「パケットフィルタを利用しない」になっていました。そして、ポート32767番までしか設定できないようなので、ここでは使わないことにします。利用する場合は32767以下の番号で追加すればいいでしょう。あと、一通りの設定が終わるまでは22番は削除しないように。設定が終わって、すべてOKになったら一番最後に22番を閉じます。

ファイアウォールの設定変更

現在の状態を確認

$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0 eth1 eth2
  sources:
  services: dhcpv6-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

services: dhcpv6-client ssh というところで、sshが開いています。

ssh-alt (50022番) の追加

上記のsshの設定をコピーして番号だけを50022にして適用することでssh-altというサービスとして50022番を開放します。

設定ファイルのコピー

$ sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh-alt.xml

ssh-alt.xml を編集

$ sudo vi /etc/firewalld/services/ssh-alt.xml

  <port protocol="tcp" port="50022"/>

firewalldの設定に追加、反映

$ sudo firewall-cmd --add-service=ssh-alt --permanent
success
$ sudo firewall-cmd --reload
success
$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0 eth1 eth2
  sources:
  services: dhcpv6-client ssh ssh-alt
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

これで、ssh-alt (ポート50022) がfirewalldで開放されました。

SELinuxの設定変更

現在の状態を確認

$ getenforce
Enforcing

SELinuxが有効であることが分かります。

semanageコマンドのインストール

SELinuxの設定を変更するためのコマンドであるsemanageコマンドをインストールします。これは policycoreutils-python パッケージに含まれているので以下のようにインストールします。

$ sudo yum install -y policycoreutils-python

SELinuxが許可しているポート番号を確認

$ sudo semanage port --list

長いリストが出てきます。grepでsshだけフィルタリングすると、

$ sudo semanage port --list | grep ssh
ssh_port_t                     tcp      22

22番だけ許可されていることが分かります。

SELinuxのポリシーにポートを追加

$ sudo semanage port --add --type ssh_port_t --proto tcp 50022
$ sudo semanage port --list | grep ssh
ssh_port_t                     tcp      50022, 22

これで、50022番がsshのポートとして追加されました。

sshd_configの設定変更

設定ファイルである /etc/ssh/sshd_config を編集します。

SSH接続ポート番号変更

#Port 22

の部分のコメントを外し、49152~65535番くらいのプライベートな番号をつけておけばいいと思う。

Port 50022

ここまでの設定を反映して、sshdを再起動して、50022番で接続できるか確認してみる。 sshd_configの構文に誤りがないかチェックするコマンドを実行します。

$ sudo sshd -t

何もエラーが出なければOKです。sshdを再起動します。この時いま開いているターミナルを閉じないように。もし、再起動後ログインできなくなったら、コンソールから入らなくてはいけなくなります。

$ sudo systemctl restart sshd

再起動後、Tera Term と WinSCP で変更後のポート番号でアクセスできたらOKです。

認証方式を公開鍵認証に変更

鍵の生成

ここでは、Tera Term で鍵のペアを作成します。メニューの「設定」→「SSH鍵生成」を選びます。鍵の種類はRSA、ビット数は4096で「生成」をクリックします。鍵の生成が終わったら、公開鍵 (id_rsa.pub) と秘密鍵 (id_rsa) をそれぞれ保存します。ここではパスフレーズは空でいいです。

f:id:aokirozin:20200709004744p:plain

公開鍵の転送

SCPで公開鍵 (id_rsa.pub) をVPSに転送します。ログインユーザのホームディレクトリの直下 (~/) の .ssh に (なければ作成)、そこに転送します。その後、id_rsa.pub ファイルを authorized_keys ファイルにマージします。

$ mkdir ~/.ssh          # .sshディレクトリがない場合
$ cd ~/.ssh
$ cat id_rsa.pub >> authorized_keys
$ rm -f id_rsa.pub

パーミッションの確認

.sshディレクトリは700、authorized_keysファイルは600である必要があります。

$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys

sshd_configの設定変更

#PubkeyAuthentication yes

のコメントを外して

PubkeyAuthentication yes

にする。

PasswordAuthentication yes

PasswordAuthentication no

にする。

sshdの再起動と接続確認

$ sudo sudo sshd -t
$ sudo systemctl restart sshd

sshd再起動後、パスワード認証ではなく、公開鍵認証でログインできたらOKです。

その他セキュリティ向上

sshd_config を編集してきます。

LoginGraceTime

#LoginGraceTime 2m

LoginGraceTime 20

にして、ユーザが20秒以内にログインを成功させないと接続を切るようにする。

PermitRootLogin

#PermitRootLogin yes

PermitRootLogin no

にして、rootユーザでログインできないようにする。

MaxAuthTries

#MaxAuthTries 6

MaxAuthTries 3

にして、1度の接続で3回までのパスワードの間違いを許可することにします。

MaxSessions

#MaxSessions 10

MaxSessions 5

にして、最大同時接続数を5にします。

PermitEmptyPasswords

#PermitEmptyPasswords no

PermitEmptyPasswords no

にして、空のパスワードを許可しないことにします。

GSSAPIAuthentication

GSSAPIAuthentication yes

GSSAPIAuthentication no

にして、GSSAPI認証は使わない。

MaxStartups

#MaxStartups 10:30:100

MaxStartups 5:75:10

として、非認証の接続が5を超えると75%の確率で拒絶をはじめて10を超えると全て拒否します。

AcceptEnv

AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS

#AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
#AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
#AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
#AcceptEnv XMODIFIERS

つぃて、サーバ側へ、環境変数を渡さないようにする。

AllowUsers
AllowUsers  *@*.jp

を追加して、特定ユーザからのみ接続を受け入れる。ここでは .jp ドメインのみ受け入れ (自分が使っているプロバイダは全て .jp ドメインのため)。

暗号アルゴリズム

Ciphers aes256-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-gcm@openssh.com,aes128-ctr,chacha20-poly1305@openssh.com
KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256
MACs umac-128-etm@openssh.com,umac-64-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128@openssh.com,umac-64@openssh.com,hmac-sha2-512,hmac-sha2-256

を追加して、弱いアルゴリズム使わわないようにする。

sshdの再起動と接続確認

$ sudo sudo sshd -t
$ sudo systemctl restart sshd

不要ポートの設定削除

新しいポートで接続できることが確認できたら、初期設定の22番ポートを無効にします。

SELinuxのポリシーから削除

SELinuxのポリシーから22番ポートをSSHの定義から外すことは上手くいかない模様。以下の削除コマンドでエラーが出てしまう。ただ、firewalldやパケットフィルタで22番を塞ぐのでセキュリティには問題はないです。

$ sudo semanage port --delete --type ssh_port_t --proto tcp 22
ValueError: Port tcp/22 is defined in policy, cannot be deleted

firewalld でssh (22番) を閉じる

sshのサービス (ssh.xml) を外す。

$ sudo firewall-cmd --remove-service=ssh --zone=public --permanent
success
$ sudo firewall-cmd --reload
success

sshが外れているか確認する。

$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client ssh-alt
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

servicesからsshが消えました。

パケットフィルタで22番の設定を削除する

さくらのVPSのパケットフィルタ利用している場合は、SSH (22番) のフィルタを削除する。


以上で、SSH接続が22番のパスワード認証から50022番の公開鍵認証になりました。

なんかVPSスケールアップしてみた

さくらのVPSを2GBで借りたけど物足りなかったので4GBにしたいと思ったら、スケールアップ機能があって、そのままスケールアップできた。差額を払えば良かった。素晴らしい。ストレージも400GBに増やした。面倒なので、またクリーンインストールした。

あとは、マルチドメインで運用するやり方とか忘れてしまった……。思い出さねば。

f:id:aokirozin:20200707002210p:plain

さくらのVPS借りた

数年ぶりさくらのVPSを借りた。メモリ2GB、SSD100GBのプラン。東京ゾーンで借りたので、月額1,780円、年額19,580円だった (それぞれ税抜)。サーバのコントロールパネルがずいぶん変わって使いやすくなっていた。さっそくOSをクリーンインストールし直して使うことにする。特に使い道は考えていないが。

Dockerとかで遊んでみたいので、OSはたぶんCentOS7にする。下の画像が標準でインストールできるOS。最新のCentOS8も使える。

f:id:aokirozin:20200704104734p:plain

自分が持っているISOイメージをアップロードしてOSインストールできるみたいだし、なかなかすごい。

SlackのクローンのRocketChatとかMattermostとか動かしてみようかな。あとは気になってるCMSのDrupal。それからメールサーバの環境をしっかり実験したい。

Python環境を構築できるAnaconda (2)

必要なパッケージのインストール

前回、

でMinicondaをインストールしたので、今回は Jupyter Notebook を使うために必要なパッケージをインストールしていきます。Jupyter Notebook とはブラウザ上で動く対話形式でPythonを実行していける実行環境です。Pythonだけではなく、他の言語にも対応しています。

インストール済みパッケージのアップデート

とりあえず、インストール済みのパッケージをアップデートしておきます。 Anaconda Prompt から、

> conda update -y --all
...
...
done

doneとでればOKです。

Jupyter Notebook のインストール

ます、現在インストールされているモジュールをconda listで確認してみます。

> conda list
# packages in environment at C:\Users\xxxxx\miniconda3:
#
# Name                    Version                   Build  Channel
ca-certificates           2020.1.1                      0
certifi                   2020.4.5.2               py38_0
openssl                   1.1.1g               he774522_0
pip                       20.1.1                   py38_1
python                    3.8.3                he1778fa_0
setuptools                47.3.0                   py38_0
sqlite                    3.32.2               h2a8f88b_0
vc                        14.1                 h0510ff6_4
vs2015_runtime            14.16.27012          hf0eaf9b_2
wheel                     0.34.2                   py38_0
wincertstore              0.2                      py38_0
zlib                      1.2.11               h62dcd97_4

モジュールは ]jupyternotebookとその依存パッケージをインストールします。

> conda install jupyter notebook
...
...
done

これで結構な数のパッケージがインストールされたはず。

Jupyter Notebook の起動

> jupyter notebook

これで、デフォルトのウェブブラウザが起動して Jupyter Notebook が表示されるはず。初期ディレクトリはユーザーのホームディレクトリ (C:\Users\xxxxx) の模様。

試しに、ここにtestという名前でPythonのファイルを作ってみます。

右上の方にある「New」から「Python 3」を選択します。

f:id:aokirozin:20200620125714p:plain

このような、「セル (Cell)」と呼ばれるものが出てくると思います。

f:id:aokirozin:20200620130017p:plain

ここにコードを書いていきます。「 + 」で実行できます。直接計算もできます。

f:id:aokirozin:20200620130322p:plain

変数も使えます。また、最終行に変数名を置くと変数がprintされます。print関数で表示させる場合と多少挙動が違うらしいです。

f:id:aokirozin:20200620130705p:plain

Jupyter Notebook の終了

Jupyter Notebook はブラウザを閉じても終了していません。Anaconda Prompt で終了処理を行う必要があります。Jupyter Notebook 起動中は Anaconda Prompt はログが流れっぱなしになっていると思いますが、そこで、「 + 」を押します。

[I 13:13:25.553 NotebookApp] Interrupted...
[I 13:13:25.554 NotebookApp] Shutting down 1 kernel
[I 13:13:25.757 NotebookApp] Kernel shutdown: 47bbe0c3-3582-41e3-ad40-88604875235c

(base) C:\Users\xxxxx>

みたいに、カーソルが帰ってくればOKです。

2020年6月の近況

今はAI関係でSE?の派遣社員をしていて、

  • CentOS
  • VirtualBox
  • Docker
  • Python
  • Bash
  • Ruby

などをいじってる。

今年に入って買って良かった高い買い物はミラーレス一眼と 2-in-1 PC。

ソニーのα7IIIはレンズがたくさんあって良い。コスパも良い。レンズは35mmか肉眼の視野に近い50mmの明るい単焦点を1本持っておけば人物撮りには問題なさげ。人以外も撮るならズームもあり。α7IIIが発売されてからみんなソニーに移ってるくらいの名機。

ソニー ミラーレス一眼 α7 III ボディ ILCE-7M3

ソニー ミラーレス一眼 α7 III ボディ ILCE-7M3

  • 発売日: 2018/03/23
  • メディア: エレクトロニクス

ノートPCを買おうとしていたんだけど結局タブレットPCにキーボード付きカバーをつけた 2-in-1 PC になるやつを買ってしまった。マイクロソフトの Surface Pro 7 だ。 顔認証がこんなに便利だとはね。僕はノートはヘビーに使わないのでタブレットPCで十分だなと思った。それよりペンでタブレットとして画面に直接書き込めるのが面白い。

あと、「これはなかなか面白いものを買ったなあ」というやつ。

温湿度計なんだけど、Wifiに接続されたHubにつなげることで外出先でも部屋の温度が分かる。それだけじゃなくて、このHubは遠隔赤外線リモコンになっていて、タイマーでエアコンのON/OFFできたり、温度をトリガーにしてエアコンのONにしたりできる。もちろんエアコンだけじゃなくてリモコン式の照明のコントロールとかもできる。面白い。

Python環境を構築できるAnaconda (1)

最近は半強制的にPythonがマイブームなのです。

といった感じでエントリーを書いていこうかと思います。

Anaconda (Miniconda) のインストール

Anacondaとは

WindowsにPythonを導入するのは面倒です。本体だけならまだしも、ライブラリをインストールするときは、依存関係なども解決しないといけないからです。AnacondaとはPython本体のインストールのみならず、関連パッケージの管理ツールや開発環境などが含まれるディストリビューションです。

ただ、Anacondaには通常では不要な大量なパッケージも含まれるため、Python本体とパッケージ管理ツール、最小限のパッケージで構成されたMinicondaをインストールすることにします。なお、インストール時に必要な容量は、Anacondaが約3GB、Minicondaが約0.3GBです。

Windows10 (1909) へのMinicondaのインストール

Minicondaのダウンロードページから「Miniconda3 Windows 64-bit」 (32bitの人は32bit) をダウンロードし、全てデフォルトの指定でインストールしましょう。

f:id:aokirozin:20200619185924p:plain

ただ、インストール先で、日本語やスペースが入っている場合、正しく動作しない恐れがあるため、そのばあいは「C:\miniconda3」にするなど、適宜対応してください。

f:id:aokirozin:20200619193558p:plain

動作確認

スタートメニューから「Anaconda3」→「Anaconda Prompt (miniconda3)」でプロンプト画面を開きます。

python -Vと打ち込んでを押してください。Vは大文字です。これはインストールされているPythonのバージョンを出力するコマンドです。

> python -V
Python 3.7.7

python --versionでも同じです。こちらはvは小文字です。

> python --version
Python 3.7.7

このようにバージョンが正常に表示されたなら、インストールはとりあえず正常に完了しているはずです。

Hello, World!

次に、PythonコードをPythonインタプリタで実行させてみます。Anaconda Prompt でpythonと入力すると、Pythonインタプリタが起動します。

> python
Python 3.7.7 (default, May  6 2020, 11:45:54) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

>>>の後にprint("Hello, World!")と入力してみます。

>>> print("Hello, World!")
Hello, World!
>>>

print関数は文字列や数値を出力する関数です。

インタプリタからでるときはexit()と入力します。

>>> exit()

>

2020 © aokirozin