TadaoYamaokaの日記

山岡忠夫Homeで公開しているプログラムの開発ネタを中心に書いていきます。

Google Colabに鍵ペアを使用してsshでログインする

Google Colabは、基本的にJupyter Notebookから使用します。

しかし、ngrokというサービスを使用することで、sshで接続する方法が知られています。
How can I ssh to google colaboratory VM? - Stack Overflow

上記サイトの方法では、sshでログインする際にパスワードが必要になりますが、鍵ペアを使用してログインしたかったため、試したところ接続することができましたので、方法を載せておきます。

なお、鍵ペアでアクセスしたい理由は、Google Colabで将棋AIのUSIエンジンを実行したかったためです。
将棋所からバッチファイル経由でssh接続する場合、パスワードを入力することができないため、パスワードなしでログインする必要があります。
sshコマンドは、引数からパスワードを渡すことができませんが、鍵ペアを使用するとパスワードなしでログインすることができます。

ngrok経由でsshdを起動

上記のサイトの方法に、鍵ペアでのログインを許可する設定を加えて、sshdを起動します。
加えたのは、

! echo "PubkeyAuthentication yes" >> /etc/ssh/sshd_config

の行です。
この時点では、まだクライアントの鍵の設定は行っていません。

#Generate root password
import random, string
password = ''.join(random.choice(string.ascii_letters + string.digits) for i in range(20))

#Download ngrok
! wget -q -c -nc https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip
! unzip -qq -n ngrok-stable-linux-amd64.zip
#Setup sshd
! apt-get install -qq -o=Dpkg::Use-Pty=0 openssh-server pwgen > /dev/null
#Set root password
! echo root:$password | chpasswd
! mkdir -p /var/run/sshd
! echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
! echo "PubkeyAuthentication yes" >> /etc/ssh/sshd_config
! echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config
! echo "LD_LIBRARY_PATH=/usr/lib64-nvidia" >> /root/.bashrc
! echo "export LD_LIBRARY_PATH" >> /root/.bashrc

#Run sshd
get_ipython().system_raw('/usr/sbin/sshd -D &')

#Ask token
print("Copy authtoken from https://dashboard.ngrok.com/auth")
import getpass
authtoken = getpass.getpass()

#Create tunnel
get_ipython().system_raw('./ngrok authtoken $authtoken && ./ngrok tcp 22 &')
#Print root password
print("Root password: {}".format(password))
#Get public address
! curl -s http://localhost:4040/api/tunnels | python3 -c \
    "import sys, json; print(json.load(sys.stdin)['tunnels'][0]['public_url'])"

実行すると、

Copy authtoken from https://dashboard.ngrok.com/auth

というリンクが表示されるので、リンク先にアクセスしてトークンをクリップボードにコピーして、入力欄に入力します。
初回アクセス時はngrokのサインインが必要です。

成功すると、以下のようにrootのパスワードと、URLが表示されます。パスワードとポートは毎回異なります。

Root password: mwbVRS9XnegtI3AVp3n7
tcp://0.tcp.ngrok.io:12451

クライアントで鍵ペア作成

sshで接続するクライアントで、鍵ペアを作成します。(作成済みの場合は、実行不要です。)
Windows 10 バージョン 1803 以降では OpenSSH クライアントがデフォルトでインストールされています。

ssh-keygen -t rsa

パスフレーズを聞かれますが、そのままEnterで問題ありません。

C:\Users\username\.ssh\に、

が作成されます。id_rsa秘密鍵なので、絶対に外に漏らさないようにしましょう。

公開鍵のアップロード

Google Colabのファイルブラウザ(左ペインからファイルを選択)から、アップロードをクリックして、作成したid_rsa.pubをアップロードします。
フォルダを変更していなければ、/content/にアップロードされます。

パスワードを使用してssh接続して、公開鍵を認証済みに設定する

クライアントから、パスワードを使用してssh接続します。

ssh root@0.tcp.ngrok.io -p 12451

-pオプションで指定するポートは、sshdを起動した際に表示されたポート番号です。
パスワードを聞かれますので、sshdを起動した際に表示されたパスワードを入力します。

rootのホームディレクトリに.sshというディレクトリを作成し、アップロードしたid_rsa.pubを/root/.ssh/authorized_keysに移動します。

mkdir /root/.ssh
mv /content/id_rsa.pub /root/.ssh/authorized_keys

これで、鍵ペアを使用してログインできるようになります。
一度sshをログアウトして、再度ログインする際には、パスワードを聞かれません。