VPS(Ubuntu/Debian)でRとPythonとJuliaの開発環境を作る: part1
はじめに
概要
VPS (Ubuntu/Debian) を借りてRとPythonとJuliaの開発環境を作るところまでの基本的な設定の仕方です。UbuntuでもDebianでもどちらでも同じように設定できます。ConoHa VPSを利用していますが、Ubuntu/DebianであればConoHaではない他のVPSでも同じように進められると思います。
part1ではssh接続の設定について書きます。これらの設定を入れることにします。
- rootユーザでのsshログインを許可しない
- 秘密鍵でのsshログインのみ許可し、パスワードログインを禁止
- ポート番号を22番から変更
- 許可したポート番号以外のポート番号を閉じる
環境
- VPS
- ConoHa VPS(メモリ1GB)
- Linux
- Ubuntu: Ubuntu 22.04.1 LTS / Debian: Debian 11
- ローカル環境
- Windows 10 Home
関連記事
- VPS(Ubuntu/Debian)でRとPythonとJuliaの開発環境を作る: part2 - suzuna's memo
- VPS(Ubuntu/Debian)でRとPythonとJuliaの開発環境を作る: part3 - suzuna's memo
VPS契約
ブラウザからConoHaにログインして新しくVPSを立てます。詳しくは公式のガイドを参照ください。
「接続許可ポート」のオプションは、ポート開放はあとでVPS上からufwで行うので、「全て許可」にチェックを入れます。また、「SSH Key」は、後でローカルで作成するので、「使用しない」にチェックを入れます。
なおConoHaではスペックのグレードを選ぶことができますが、メモリ1GB以上のプランを選んでおくといいです。VPSを立てた後からプランをアップグレード・ダウングレードできますが、512MBプランはその対象外であるためです。
パッケージのアップデート
ローカルのWindowsのコマンドプロンプトを立ち上げ、rootユーザでsshログインします。パスワードを聞かれるので、VPSを立てる時にConoHaの設定画面で入力したrootパスワードを入力してください。
なお、以下、かっこ([])で囲った部分は、何らかの値を入れることを示します。実際にコマンドを打つ際はかっこは不要です。
# sshはデフォルトでは22番ポートでログインするので、"-p 22"は付けなくていい
ssh root@[VPSのIPアドレス]
ログイン後、まずはパッケージをアップデートします。
apt update -y
apt upgrade -y
apt dist-upgrade -y
apt --purge autoremove
再起動するようメッセージで求められた場合はreboot
で再起動してください。再起動されるまで数十秒程度かかりますので、そのくらいの時間待ってから再度rootユーザでsshログインします。
一般ユーザの作成+sudoユーザー化
セキュリティの観点からrootユーザではssh接続できないようにします。そのため、sudo権限を持つ一般ユーザーを作成し、このユーザーにsshでログインすることにします。
ここから先、userというユーザー名のユーザーを作成することにします。
# "-m"を付けることで、/home/直下にユーザーフォルダを作成する
useradd -m user
次にsshのログインパスワードを設定します。パスワードを聞かれるので、設定したいパスワードを入力してください。
passwd user
ここまで終わったら、以下id user
と入力すると、(sudo)
の文字列は出てこないはずです。これは、userがsudo権限を持っていないユーザーであることを示します。
id user
# (sudo)の文字列が出てこない = sudoerではない
# uid=xxxx(user) gid=xxxx(user) groups=xxxx(user)
userをsudoerにします。
gpasswd -a user sudo
ここまで終わったら、id user
と入力すると、(sudo)
の文字列が表示されるはずです。
id user
# (sudo)の文字列が表示される = sudoer
# uid=xxxx(user) gid=xxxx(user) groups=xxxx(user) xxxx(sudo)
rootでのsshログイン禁止
exit
と打ってログインを切ってから、以下をローカルのコマンドプロンプトで打ってuserでログインします(ログインを切らずにsu user
でもいいです)。パスワードを入力する必要があるので、passwd user
で設定したパスワードを入力してください。
ssh user@[VPSのIPアドレス]
ssh接続の設定ファイルである/etc/ssh/sshd_config
を編集します。sudo権限でないと編集できないので、sudoをコマンドの先頭に付けます。
sudo nano /etc/ssh/sshd_config
/etc/ssh/sshd_config
がnanoで開きます。PermitRootLogin yes
と書いてある行があるので、このyes
をno
に書き換え、保存してsshd_config
を閉じます。
なお、nanoではCtrl + Oを押してからEnterを押して上書き保存し、次にCtrl + Xで閉じることができます。
上書き保存してnanoを終了できたら、以下のコマンドでsshd_config
の変更内容を反映させます。
sudo systemctl restart sshd
rootではsshログインできず、userではログインできることを確認しておく必要があります。
ローカルでコマンドプロンプトを別窓で立ち上げ、ssh root@[VPSのIPアドレス]
ではログインできなくなったことを確認しておきます。次にssh user@[VPSのIPアドレス]
ではログインできることも確認しておきます。
このとき、今設定のために接続しているコマンドプロンプトは閉じず、別窓でコマンドプロンプトを開くことに注意してください。sshの設定に失敗して接続できなくなった場合、接続できていたコマンドプロンプトを閉じてしまうとsshでログインできなくなってしまいます。(仮にそうなったとしても、ConoHaではブラウザの設定画面からコンソールログインができるはずですが…。)以降もssh接続の設定を変える度に都度接続できることを確認していきますが、必ず今繋いでいるコマンドプロンプトを閉じないで別窓で確認するようにします。
ssh鍵の作成と登録
ローカルに、VPSと接続するための秘密鍵と公開鍵を作ります。
rootユーザでログインしているコマンドプロンプトを閉じてssh接続を切ってから、以下を入力します。ユーザーフォルダ直下に.sshフォルダが存在しなければ先に.sshフォルダを作成してください。-fの後には鍵のファイルに付けたいファイル名を入れます。ここでは仮でhogeとしておきます。
cd [ユーザーフォルダ直下の.sshフォルダのパス]
ssh-keygen -t ed25519 -f hoge
passphraseを入力してくださいなどと3回ほど入力を求められるはずですが、全て何も入力せずにEnterキーを押してください。
そうすると、ユーザーフォルダの直下の.sshフォルダにhogeとhoge.pubという二つのファイルが作られていると思います。前者は秘密鍵、後者は公開鍵です。
次に、今作成した鍵のうち、公開鍵(hoge.pub)をVPSの~/.ssh/authorized_keys
に保存します。ssh user@[VPSのIPアドレス]
でVPSのuserにsshログインしてから、ターミナルで以下を入力します。
cd ~
mkdir .ssh
chmod 700 .ssh
touch .ssh/authorized_keys
nano .ssh/authorized_keys
nanoで~/.ssh/authorized_keys
が開きます。ここでローカルでhoge.pub
を開き、中身を全選択 -> クリップボードにコピーし、sshで接続しているコマンドプロンプトのnanoの画面に貼り付けて上書き保存してください。
念のためcat .ssh/authorized_keys
を実行し、ローカルのhoge.pub
と同じものが貼り付けられていることを確認します。
最後に.ssh/authorized_keys
に600のパーミッションを設定します。
chmod 600 .ssh/authorized_keys
ここで、正常に秘密鍵でssh接続できることを確認します。今VPSにssh接続しているコマンドプロンプトとは別窓でコマンドプロンプトを立ち上げ、以下を入力してssh接続できることを確かめてください。
ssh user@[VPSのIPアドレス] -i [ローカルの秘密鍵hogeのフルパス]
パスワードログインの禁止
次に、全てのユーザでパスワードログインできないようにします。
sudo nano /etc/ssh/sshd_config
PasswordAuthentication yes
と書いてある行があるので、そのyes
をno
に変えて上書き保存します。私の場合、PasswordAuthentication
は2箇所あったので、2箇所ともno
に変えました。
以下で設定を反映させます。
sudo systemctl restart sshd
今ssh接続しているコマンドプロンプトとは別窓でコマンドプロンプトを立ち上げ、パスワード認証ではログインできず、かつ鍵ではログインできることを確認します。
# パスワードログインしてみる
# これはエラーでログインできないことを確認する
ssh user@[VPSのIPアドレス] -o PreferredAuthentications=password
# 次に、鍵でログインしてみる
# これはログインできることを確認する
ssh user@[VPSのIPアドレス] -i [ローカルの秘密鍵hogeのフルパス]
ポート開放+sshのポート番号の変更
sshのポート番号はデフォルトでは22番ですが、これを他の適当な番号に変えます。
ポート番号は0番~65535番まであり、うち0番~1023番のWell-known Portは他のサービスで使われることもあるので、1024番以上のポートにしましょう。1024番~49151番のRegistered Portも使われていることがあるので、好みが特になければユーザーが自由に使えることになっている49152番以降のポート番号にするといいと思います。ここでは仮に50022番に変更することにします。
まず、念のため50022番がポート番号として使われていないことを確認します。
sudo lsof -i:50022
何もコンソールに表示されなければ使われていないので問題ありません。
ポート開放
ポート開放の設定に使うufwをインストールし、OSが起動した際に自動起動するようにします。
sudo apt install ufw
sudo systemctl enable ufw
それでは次に、ufwを使ってファイアウォールの設定を変更し、50022番を通すようにします。その前に、50022番が開放されていないことを念のため確認します。
sudo ufw status
50022番がallowされていなければ、開放する必要があります。allowされていれば以下の開放の必要はありません。(私が試した所、初期状態では22番のOpenSSHしか開放されていませんでした)
sudo ufw allow 50022
再度sudo ufw status
と打って、50022番がallowとなっていればOKです。
ssh接続のポート番号の変更
そしたら、sshd_config
を編集してssh接続に使用するポート番号を変更します。
sudo nano /etc/ssh/sshd_config
Port 22
と書いてある行があると思います。この22
を50022
に変更して上書き保存します。
以下で設定を反映させます。
sudo systemctl restart sshd
最後に、今ssh接続しているコマンドプロンプトとは別窓でコマンドプロンプトを立ち上げ、22番ではログインできず、50022番ではログインできることを確認します。
# これはエラーでログインできないことを確認する
ssh user@[VPSのIPアドレス] -i [ローカルの秘密鍵hogeのフルパス] -p 22
# 次に、これはログインできることを確認する
ssh user@[VPSのIPアドレス] -i [ローカルの秘密鍵hogeのフルパス] -p 50022
これでひとまず最低限のssh接続のセキュリティ確保の設定が終わりました。お疲れ様でした。
ConoHaではVPSのディスクイメージを保存しておくことができます。VPSを削除しても、新しくVPSを作る際に、保存したディスクイメージから復元することができ便利です。この段階で一旦VPSのディスクイメージを作っておくと役立つかもしれません。
ローカルのconfigにsshログインの設定を記載
さて、これからはssh user@[VPSのIPアドレス] -i [ローカルの秘密鍵hogeのフルパス] -p 50022
でログインするわけですが、毎回これを入力するのは面倒です。それを簡略化できるように、ローカルの~/.ssh/config
にssh接続の設定を記載します。
ローカルのユーザーフォルダ直下の.ssh/config
を適当なエディタで開き、以下を追記して上書き保存します。
Host conoha
HostName [VPSのIPアドレス]
User user # VPSで接続したいユーザー名。ここでは先程作ったuser
Port 50022
IdentityFile [上で作成した秘密鍵 (hoge) のフルパス]
Host conoha
のconoha
は好きな名前にしてください。ただし、.ssh/config
の中では一意な名前にする必要があります。
Identity Fileは、Windowsではファイルパスの区切り文字はバックスラッシュですが、バックスラッシュでもUnix風のスラッシュ(~/.ssh/hoge
)でもどちらでも構いません。
これにより、今後はssh user@[VPSのIPアドレス] -i [ローカルの秘密鍵hogeのフルパス] -p 50022
の代わりにssh conoha
でログインできるようになります。
ローカルのVSCodeに拡張機能Remote Developmentをインストール
VSCodeの拡張機能Remote Developmentを入れると、VSCode上でssh接続し、あたかもローカルのファイルを操作しているかのように作業ができます。入れ方は良記事がたくさんあるのでググってみてください。
この拡張機能は色々便利なのですが、VSCodeからssh接続してターミナルでcode [開きたいファイルのパス]
と打つと、VSCode上でそのファイルが開かれて編集できることが中々快適です。nano [開きたいファイルのパス]
の代わりになります。