2014年11月15日

ComicCafeのセキュリティを高める

ComicCafe、これすごくいいです。
すごくいいんだけど、自宅サーバを外部に晒すのは不安なので、セキュリティを高めてみよう、というお話。
一応、ComicCafeの機能として、アクセス可能な端末を限定する機能があるのはいいんだけど、それだけではちょっと不安。


■外部公開する上でセキュリティ上、気になる点
2015年1月2日更新。ComicCafe v0.6.35がリリースされ、Web管理画面のポートが変更可能になりました。これにより、Web管理画面は外部に晒さないようにできます。従って本記事は、ビューアのアクセスを保護したい場合の内容となります。

・Web管理画面を晒す必要がある
 (ビューアアクセスとWeb管理画面は、ともに同じ9999番ポート)

Web管理画面とビューアアクセスはhttpでありhttpsではない

つまり、ビューアアクセスを可能にしている状態(9999番ポートを解放)だと、管理画面へもアクセスもできてしまう。

管理画面は、アクセス可能な端末を限定できないので、ログイン画面を世界に向けて晒している状態になる。

管理画面は、IDとパスワードでガードしているとはいえ、管理画面の存在そのものを晒したくない。

また、httpsではないので、ID、パスワード、ビューア識別コードとも盗み見は不可能ではない。

ルータでIPアドレス制限できればいいんだけど、ビューアのIPアドレスは固定ではないので、それもできない。

というわけで、経路の暗号化と、ComicCafeサーバ(=ビューアアクセスポートと読み替えてください)を、直接外部に晒さずにすむ方法についてまとめた。


■概要
ComicCafeサーバを、直接外部に公開することなく、セキュアにアクセスできるようにする。
外部からのアクセアスにはsshを利用し、ComicCafeサーバへのアクセスは、sshのポート転送により行う。
わかりやすく言うと、sshにてセキュアなトンネルを作成し、そのトンネルをComicCafeの通信経路として使う。

これにより、外部に公開するのはsshのポートのみとなり、ComicCafeを外部に直接公開しなくてすむ。
sshにより、強固なセキュリティと、暗号化された安全な通信経路を確保する。


■設定手順概要
まずはローカル環境(同一LAN内)にて、sshトンネルを作成し、そのトンネルを使ってComicCafeサーバへ接続できるようにする。
その後、sshポートを外部に公開し、外部からsshポート経由でアクセスできるようにする。

sshポート転送のことがわかっている場合は、「■ビューア側準備」以降を見てもらえれば大丈夫と思う。


■前準備
とりあえず、ComicCafeそのものが動作していないと始まらないので、インストールしてLAN内で利用できるようにしておくこと。
ComicCafeのインストールと設定はオフィシャルページを参照。
ComicCafe Wiki
http://seesaawiki.jp/comiccafe/


■環境について
当記事では以下のネットワーク構成としている。
※環境に合わせて置き換えること。

sshdサーバ     Windows    192.168.12.200 port:22
ComicCafeサーバ  Windows    192.168.12.150 port:9999
ComicCafeビューア Androidスマホ

※sshdはCOPSSHを利用、sshクライアントはConnectBotを利用。


■sshdサーバ側の準備
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

ssh鍵ファイルの生成と、sshdのインストールと設定について示す。
特に特殊なことは何もないので、鍵ファイルを用いたssh接続環境を持っていれば、読み飛ばして「■ビューア側準備」へ行く。


1.ssh鍵ファイル(公開鍵、秘密鍵)の生成
COPSSHの鍵生成機能がうまく動作してくれなかったので、teratermを使って鍵ファイルを作成する。

teratermをダウンロード
http://sourceforge.jp/projects/ttssh2/

ttermpro.exeを起動。このダイアログはとりあえずキャンセル押下。


Setup → SSH KeyGenerator 選択。


下図の通り必要項目を入力し、[Save public Key]、[Save private Key] ボタンを順番に押下する。

[Save public Key] → 公開鍵ファイル名:id_rsa.pub
パスワードは関係無いので、パスワードは空欄のまま作成。
※パスワード有無に関係なく、同じ公開鍵ファイルが作成される。

[Save private Key] → 秘密鍵ファイル名:id_rsa
パスワードを設定する。
連続で作成すれば、パスワードの異なる複数の秘密鍵ファイルを生成できる。
パスワードの無い秘密鍵ファイルも1つ作成しておくことをおすすめする。

とりあえず、上記2ファイルを作成しておく。


2.sshdのインストールと公開鍵の指定
当方はCOPSSHを利用した。以下はCOPSSHの設定例。

COPSSHダウンロード
以下のリンク先より、Copssh_5.0.0_Free_Installer.zip をダウンロードし、解凍してインストール。
https://www.itefix.net/content/copssh-free-edition

copsshcp.exeを起動



Usersタブの[Add]ボタン押下。


ユーザ追加ウィザードが立ち上がる。

どのユーザでもよいので選択。

この画面では以下のように選択して[Forward]ボタン押下。


[Keys]ボタン押下。


[Import]ボタン押下。


公開鍵ファイル(id_rsa.pub)の内容をコピペして[Apply]ボタン押下。


このように公開鍵ファイルがセットされていればOK。[Apply]ボタン押下。


他はいじる必要ないけど、当方の設定は以下の通り。





バージョンは5.0.0ではなく、なぜか2.4.0? 一応最新のようだけど。

最後にCOPSSHを再起動する。
○ボタンを押して停止後、再度押して緑(running)にする。





ここまででCOPSSHの設定はOKだが、念のため、鍵ファイルを使った接続が可能か確認する。確認はteratermを利用する。


3.ssh接続確認

ttermpro.exeを起動する。
接続先はCOPSSHのPCを指定して[OK]押下。


[Continue]押下。



以下の画面では、COPSSHで指定したユーザ名と、鍵ファイルを作成する際に入力したパスワードを入力。
中段の[Private key file]を押下し、秘密鍵ファイルを選択。
最後に[OK]ボタン押下。


このようなコマンドプロンプトが表示されればOK。


以上でsshd側の準備は完了。


■ビューア側準備
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

ここでは、sshトンネルを作成するためのConnectBotの設定と、sshトンネルを使い、ComicCafeを接続するための手順について示す。

1.秘密鍵ファイル(id_rsa)をコピー
最初にConnectBotで必要な秘密鍵ファイル(id_rsa)を、スマホ側の/sdcardフォルダにコピーしておく。
sdcardスロットが無いスマホでも、/sdcardフォルダはあるのでそこにコピー。
※ConnectBotの場合、必ず/sdcardフォルダに置かないとダメ。

2.ConnectBot ssh接続の設定
Playストアより、ConnectBotをインストールしておく。


ConnectBotを起動。
接続設定を作成するため、とりあえず、ユーザ名@ホスト名:ポート の形式で入力してenter。


当然、鍵ファイルを指定していないので、接続できない。[No]を押下。

コンソールの文字、小さ!

ホスト名を長押しメニューより、一旦切断する。


右下のメニュー押下後、「公開鍵管理」 押下。


右下のメニュー押下後、「インポート」押下。


/sdcardにコピーしておいた秘密鍵ファイルを選択する。


こんな感じでプールされる。

ちなみに、画面上部に「公開鍵」ってなってるけど、秘密鍵の間違いでしょう。

ホスト名を長押しメニューより、「接続ホストの編集」を選択。


「公開鍵認証を使用」を選択。


プールされている秘密鍵名が出るので、「id_rsa」を選択。


以上でConnectBotによるssh接続の準備はできた。


3.ConnectBot ssh接続確認
実際にssh接続可能かを以下の通り確認しておく。

ホストを選択することでssh接続が行われる。


パスワードを求められるので、鍵ファイル生成時に設定したパスワードを入力。


このようなコマンドプロンプトが表示されればssh接続は成功。


一旦切断する。
ここまでで、鍵ファイルを用いたssh接続は完了。
次はポート転送の設定を行う。


4.ConnectBot ポート転送の設定

ホスト名を長押しメニューより、「ポート転送の編集」を選択。


右下のメニュー押下後、「ポート転送の追加」を選択。


転送先は環境に合わせ、以下のように入力。

鍵の名前」って多分間違い。表示名のことなので任意の名前をつける。
ソースポート」は、ConnectBotが待ち受けるポートなので、任意でよいが、ComicCafe側の設定時に使うので覚えておくこと。
転送先」は、ComicCafeサーバなので 192.168.12.150:9999 にする。

以上でポート転送の設定も完了。
接続してみて、コマンドプロンプトが表示されればOK。
これでsshトンネルは完成。


■sshトンネル経由でComicCafeを接続する
sshトンネル経由でComicCafeを接続するためには、先にConnectBotにて、sshトンネルを確立しておき、そのトンネルに対してComicCafeを接続する必要がある。以下その手順を示す。

1.ConnectBotにて、sshトンネルを確立
ポート転送の設定付きでssh接続を行う。
以下のコマンドプロンプトになっていることを確認する。


この状態のまま、バックキーかホームボタンでConnectBotを抜ける。
抜けてもConnectBotの接続は維持される。(上部の通知バーに居るはず)

2.ComicCafeにて、通常の接続確認
念のため、sshトンネルではない通常接続が可能か確認しておく。
設定 → サーバとアカウント にて、通常接続の場合の設定は以下の通り。

[テスト]ボタンにて、「接続成功!!」と出ることを確認。


3.ComicCafeにて、sshトンネル経由の接続先作成
2の接続先を長押しメニュー → コピー にて、上記接続のコピーを作成。
コピーした接続に対し、sshトンネルを通す設定を行う。
コピーした接続先を長押しメニュー → 編集より、

ホスト名」は、「localhost」固定
※自端末のConnectBotに接続するため
ポート番号」は、ConnectBotのポート転送の設定で指定したソースポートと同じポート番号にする。
ユーザ名」「パスワード」は、コピーした接続なら、変更する必要なし。
※ここはsshのアカウント情報ではなく、ComicCafeのアカウント情報。

[テスト]ボタンにて、「接続成功!!」と出ればOK。
後はこの接続先を使って、ComicCafeサーバから本が読めるはず。

ここまでで、ローカル環境(同一LAN内)にて、sshトンネル経由でComicCafeサーバへ接続できるようになった。


■sshトンネル経由で外からComicCafe接続
外からアクセスできるようルータの設定を変更し、sshポートを外部公開する。
これについては、利用しているルータの説明書をみて設定すること。
外部公開するのは、もちろんsshポートのみでよい。

以下、sshがポート22で外部公開されているものとして記述する。

ローカル環境でのsshトンネル接続ができていれば、設定変更が必要なのは、ConnectBotの接続先み。

1.ConnectBotの接続先を、外向けのsshポートへ変更する
ホスト名を長押しメニューより、「接続ホスト」の編集を選択。


下の方にスクロールして「ホスト」を選択。


外部公開したsshのグローバルアドレスに変更。

さすがにこれは秘密(^^)

変更はこれだけでOK。

以上で、外からConnectBotが接続できるはず。
WiFiをOFFにして、キャリア回線経由で接続できることが確認できればOK。

以上でセキュアなComicCafe環境の完成。


■補足情報
ConnectBotの設定の中にある、「シェルセッションを使う(ポート転送のみ行う場合は無効にしてください)」を無効にしてもよい。
でも多分ConnectBotのバグと思うけど、この設定を無効にしていた場合、CPUの使用率が大きく上がってしまい、電池の減りが早いので、有効のままがいいと思う。

ConnectBot接続時にパスワードを入力するのがうざい場合、秘密鍵ファイルを作成する際にパスワード欄を空のままで作成すればよい。鍵認証なのでこれでも十分だが、鍵ファイルと接続先情報は流出させないよう管理は厳重に。


■最後に
鍵認証のssh接続なので、十分にセキュアだが、万が一、侵入された場合を考慮して、COPSSHのシェルにも制限を掛けておけばなお良い。この辺りはこちらを参照。

Androidアプリでポート転送が行えるものをいくつか試したが、まともに動作したのは、ConnectBotのみだった。putty鍵の組み合わせもいろいろ試したんだけど、やり方がまずかったのだろうか?

ConnectBotは、セッションが切れた場合の自動再接続がうまく動作していない模様。一応、自動で再接続してくれそうなオプション項目はあるんだけどね。
通信が安定していれば問題ないだけに惜しい。。。
このポート転送アプリはいいよ、ってのあったら教えていただけると幸いです。



posted by frogie at 17:30 | Comment(4) | TrackBack(0) | スマホ | このブログの読者になる | 更新情報をチェックする

2014年11月16日

COPSSHにて、なにもできない制限ユーザを作成する

sshポート転送さえできれば良い場合、シェルは不要なので、当該アカウントには制限を掛ける。
ここで作成する制限ユーザは、移動も参照も何もできず、ビルトインコマンドを実行しようとしたらexitする。

■制限ユーザの作成方法
ログインした状態で、以下の処理を行う。

1.rbashコマンドを作成する
rbashとは、bash -r と同じ制限付きのシェル。

$ ln -s /bin/bash /bin/rbash


2.ユーザに制限を掛ける

エディタnanoを起動して、.bashrcを編集する。
$ nano ~/.bashrc

編集内容
.bashrc の末尾に以下を追記する。
aliasするコマンドは、bashのビルトインコマンド全て。
bashのビルトインコマンドは、helpで参照可能。

.bashrcの末尾に追加した内容。
export PS1="$ "
export PATH=""
alias bg='exit'
alias bind='exit'
alias break='exit'
alias builtin='exit'
alias caller='exit'
alias case='exit'
alias cd='exit'
alias command='exit'
alias compgen='exit'
alias complete='exit'
alias compopt='exit'
alias continue='exit'
alias coproc='exit'
alias declare='exit'
alias dirs='exit'
alias disown='exit'
alias echo='exit'
alias enable='exit'
alias eval='exit'
alias exec='exit'
alias export='exit'
alias fc='exit'
alias fg='exit'
alias for='exit'
alias function='exit'
alias getopts='exit'
alias hash='exit'
alias help='exit'
alias history='exit'
alias if='exit'
alias job_spec='exit'
alias jobs='exit'
alias kill='exit'
alias let='exit'
alias local='exit'
alias logout='exit'
alias mapfile='exit'
alias popd='exit'
alias printf='exit'
alias pushd='exit'
alias pwd='exit'
alias read='exit'
alias readarray='exit'
alias readonly='exit'
alias return='exit'
alias select='exit'
alias set='exit'
alias shift='exit'
alias shopt='exit'
alias source='exit'
alias suspend='exit'
alias test='exit'
alias time='exit'
alias times='exit'
alias trap='exit'
alias type='exit'
alias typeset='exit'
alias ulimit='exit'
alias umask='exit'
alias unalias='exit'
alias unset='exit'
alias until='exit'
alias variables='exit'
alias wait='exit'
alias while='exit'
alias FALSE='exit'
alias TRUE='exit'
alias alias='exit'


次に、.bash_profileを編集する。
$ nano ~/.bash_profile

編集内容
.bash_profileの最終行に以下を追記する。

.bash_profileの末尾に追加した内容。
/bin/rbash
exit

以上で完了。

試しにこの状態でログインし、コマンドを実行してみる。
$ ls
rbash: ls: No such file or directory
$
$ /bin/ls
rbash: /bin/ls: restricted: cannot specify `/' in command names
$
$ pwd
exit

他のパスにあるコマンドは全てはじかれる。
ビルトインコマンドを実行したらexitさせられる。

タグ:ComicCafe Linux
posted by frogie at 17:57 | Comment(0) | TrackBack(0) | PC、周辺機器等 | このブログの読者になる | 更新情報をチェックする