Corredor

ウェブ、プログラミングの勉強メモ。

XREA のサーバに SSH 接続する

メインサイト Neo's World は、XREA というウェブホスティングサービスのかなり初期の頃に取得したアカウントだ。コレ以前に s15 サーバも取得していたし、別サイトで s38s41s58 サーバなどをレンタルしたことがある。さらに最近、Yahoo! Geocities の閉鎖に伴う移行キャンペーンを利用して、g3 サーバを借りられた。

そんな XREA だが、どうやらサーバに SSH 接続できるようなので、試してみた。

接続元 IP 許可設定を行う

まず、SSH 接続したいマシンにて、XREA の管理画面にログインする。左メニューの「サイト設定」→「ツール/セキュリティー」と進み、「SSH 接続 IP 許可」セクションで「SSH 接続 IP 許可」ボタンを押下する。

コレで、このマシンの IP アドレスから SSH 接続できるようになる。ポケット Wi-Fi を使っていたりして IP が変動する場合は、SSH 接続の前に都度コレを行う必要がある。

パスワードを使って SSH 接続する

続いて、アカウントのパスワードを使って SSH 接続を行う。ココで入力するパスワードは、「サイト設定」→「サイト一覧」→「FTP/SFTP 接続情報」欄で確認できるパスワードだ。

$ ssh -l 【ID】 【Server】.xrea.com

# この後パスワードを聞かれるので入力する

すると SSH 接続できるはずだ。

公開鍵ファイルを設定する

SSH 接続後は、sudo などは出来ないものの、一般的な Linux サーバとして利用できるので、公開鍵認証による SSH 接続のための手順を取れば、SSH 鍵でアクセスできるようになる。いわゆる authorized_keys ファイルの準備、ということだ。

まずは接続元のローカルマシンで、SSH 鍵ペアを発行しておこう。

$ ssh-keygen -t rsa -b 4096 -N '' -C 'NeosXreaKey'

ファイルは ~/.ssh/id_rsa (秘密鍵)、~/.ssh/id_rsa.pub (公開鍵) の2ファイルが出力できたものとする。

続いて、先程パスワードを使って SSH 接続した XREA サーバ側で、以下のように作業する。

# ~/.ssh/ ディレクトリを作り権限を設定する
$$ mkdir .ssh
$$ chmod 700 .ssh
$$ cd .ssh

# ~/.ssh/authorized_keys ファイルを作成する
$$ touch authorized_keys
$$ chmod 600 authorized_keys

# このファイルの中に、先程発行した公開鍵ファイルの内容をコピペする
$$ vi authorized_keys

設定ができたら、このターミナルは一旦接続したままにしておいて、別のターミナルウィンドウから、公開鍵認証による SSH 接続ができるか試してみる。

# 秘密鍵ファイルを使ってアクセスできるか試す
$ ssh -i ~/.ssh/id_rsa 【ID】@【Server】.xrea.com

接続できるようなら問題なし。

XREA API を利用して毎度の接続を楽にする

コレで XREA サーバに SSH 接続できるようにはなったが、IP が変動する場合、XREA 管理画面から「接続元 IP 許可」を毎回行わないといけないのは面倒だ。

そこで、XREA が公開している API を利用して、この許可設定をコマンドラインから行ってしまおうと思う。

API Key の発行

先に、API コールに使用する API Key を発行する。

XREA 管理画面の右上、ユーザアイコンから「契約情報」を選び、最下部の「API KEY」セクションに移動する。「API KEY 発行」ボタンを押下すると、API Key 文字列が取得できるので、コレをコピーしておく。

接続元 IP 許可 API を curl でコールする

接続元 IP 許可の API リファレンスは以下。

XREA API のちょっと独特な点として、リクエストパラメータは JSON 形式ではなく、Key・Value 形式で送れ、とのことである。この書き方がイマイチ分からなかったので試行錯誤したが、curl コマンドの場合は

curl  -d 'Key1=Value1'  -d 'Key2=Value2'

といった形で、1項目ずつ指定していけば良いと分かった。

param.addr のように、ネスト構造になっている Key については、

curl  -d 'Key[SubKey]=Value1'  -d 'param[addr]=Value2'

というように書けば良い。

まずは試しに、ユーザ情報を取得するだけの API をコールしてみよう。\ 記号で1コマンドを改行してみせたが、1行にまとめても良い。API Key、アカウントの ID、サーバ番号を代入する。

$ curl -X POST https://api.xrea.com/v1/user/info \
      -d 'api_secret_key=【API Key】' \
      -d 'account=【ID】' \
      -d 'server_name=【Server】.xrea.com'

うまくユーザ情報の JSON が取得できたら OK。

接続元 IP を許可するための API は、以下のように叩くと良いだろう。

$ curl -X POST https://api.xrea.com/v1/tool/ssh_ip_allow \
      -d 'api_secret_key=【API Key】' \
      -d 'account=【ID】' \
      -d 'server_name=【Server】.xrea.com' \
      -d "param[addr]=`curl -sS ifconfig.me`"

param[addr] に与える値として、$ curl -sS ifconfig.me というコマンドで取得した自身の IP アドレスを設定している。このコマンドを単体で叩くと分かるが、ifconfig.me というサイトがアクセス元の Public IP アドレスを返してくれるので、それを設定しているというワケ。

あとは SSH 接続するのみ

接続元 IP を許可できたら、あとは SSH 接続するのみ。パスワード入力でも、公開鍵認証でも、どちらでも変わらない。

# パスワード入力式
$ ssh -l 【ID】 【Server】.xrea.com

# 鍵認証式
$ ssh -i ~/.ssh/id_rsa 【ID】@【Server】.xrea.com

パスワード認証の方は、対話式プロンプトになるのが避けられないので、以前紹介した expectspawnsend コマンドの複合技でパスワード入力を自動化すると楽になるだろう。

$ expect -c "
set timeout 5
spawn ssh -l 【ID】 【Server】.xrea.com
expect \"【ID】@【Server】.xrea.com's password:\"
send \"【Password】\n\"
interact
"

neos21.hatenablog.com


以上。

XREA サーバに SSH 接続できると、色々と夢がひろがりんぐだ。

参考

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)