▼ 2010/06/08(火) sshで知っておくと便利なこと
sshの基本的な操作じゃなくて、知っていると便利なことを書いていくことにします。主にポートフォワーディングについて。
説明をわかりやすくする為に、『社内と社外』なんて卑猥な言葉を使っているけれど、学生の人は『自宅と学内』などに読み替えてくれればいいのではないかと。
IMAPの経路を暗号化する
会社で使うものと言えばメールだと思うんだけど、どういうわけかIMAPSやPOPSは提供されていなく、IMAPやPOPでしかメールの受信が出来ないものとする。この2つのプロトコルでは暗号化されないので、メールの内容はおろか、パスワードまで平文で流れてしまうので危険。
例えば、自分のマシンでどんな感じでIMAPと通信されているか確認するには、ngrepを使うと簡単に確認出来る。
ngrepのインストール。
$ sudo aptitude install ngrep
IMAPとの通信に絞り込んでキャプチャ。
$ sudo ngrep -q port 143
この状態でメールの受信をすれば、色々と危険なことが分かる。ちなみに通常の状態であれば、LAN内の他のマシンのパケットをキャプチャ出来ない。しかし、ARP SPOOFINGやスイッチ自体に総攻撃を仕掛けて飽和状態にさせたりなどの手法を使えば可能なので(こんなことを職場でやる人間は居ないと思うが……)、安心は出来ない。
そこで、sshを使って簡易的にIMAPの通信を暗号化する方法の紹介でも。条件としては、IMAPサーバにssh出来ること。
$ ssh -f -N -L10143:localhost:143 -l username imap_server
usernameはimap_serverにsshする時に必要なユーザ名。
これで、localhostの10143番がリスンされ、このポートがIMAPサーバの143番にフォワーディングされた。なので、メールソフトのIMAPの設定を今までは、imap_serverの143番を指定していたと思うが、このコマンドを実行してからは、localhostの10143番を指定してやればいい。
念のため、上記がちゃんと実行されているかは、psコマンドやlsofコマンドで確認するといい。
$ ps aux | grep ssh $ lsof -nPi:10143
あと、メールソフトによってはポートの指定を細かく指定出来ないものもある。そんな場合は、面倒臭いのでlocalhostも143番で待ち受けてしまうのも手(もちろんlocalhostで143番が使われていないこと)
$ sudo ssh -f -N -L143:localhost:143 -l username imap_server
1024番以下のポートでリスンするので、sudoが必要となることに注意。
これで、自分のマシンとIMAPサーバ間のIMAPの通信が暗号化されたので、途中でman in the middleを行なおうとする不届き者が居ても安心。
もう少し突っ込んだIMAPとの暗号化
上記ではあくまでも社内でのIMAP通信についての話。今度は社外からについて。
社外からIMAPサーバに接続する際、これまた暗号化されていないIMAPだと心配だ。更に酷いことに、もしかすると会社の方針で社外からはIMAPとの通信を許可していないかもしれない。要は社外からはメールの受信が出来ませんよ……みたいな環境。
さて、これで諦めてはいけない。条件が成立すれば、こんな状況だって社外からIMAPと通信が出来て、メールの受信が出来る。
必要条件としては、社外から社内に向けて踏み台サーバがあったりすること。要はssh出来るサーバがあること。何かしらのメンテナンスの為に、gateway_serverというサーバがあり、こいつがsshdを2222番ポートで開始しているとする。そして、このサーバには社外からもアクセス可能と……
更に、このgateway_serverからimap_serverへssh可能という条件であれば、今回のIMAPが成立する(もちろんIMAPサーバに外部から直接ssh出来るのならもっと話は早いのだが……今回は踏み台が間に入る環境を想定)
sshの経路しては、
社外の自宅マシン <--> 社内のgateway_server(sshdはポート2222番でリスン) <--> imap_server
こんな環境で、本来なら社外からIMAPが許されていないのに、IMAPでのメールの受信をするには、以下のように自宅マシンでsshを実行して、ポートフォワーディングしてやる。
$ ssh -f -N -L10143:imap_server:143 -p 2222 -l username gateway_server
usernameはgateway_serverへログインする際のユーザ名。これでlocalhost上で10143番がリスンされ、こいつがなんと社内の奥深くに眠るimap_serverの143番と結びついた。
あとは、メールソフトのIMAPの設定を、localhostの143番に変更してやれば、本来なら外部からのIMAPは許可されていないはずだが、メールの受信が出来る。
次はSOCKSだ
さて、次はWebページへのアクセスについて。社内でしか見られないWebコンテンツがあるとする。当然、外部である自宅からは見ることが出来ない。でも見たい……どうしても見たい。これも条件さえ成立すれば外部である自宅から閲覧が可能となる。
上記のIMAPの時と同じ環境で、gateway_server(ポート2222でsshdをリスン)があって、このgateway_serverにssh出来ることが条件となる。
今までは、静的なポートフォワーディングを使っていたが、今回は動的なポートフォワーディングであるSOCKSを利用する。こんな感じで、自宅マシンでsshを実行する。
$ ssh -f -N -D 1080 -p 2222 -l username gateway_server
これでlocalhostの1080番がリスンされた。
あとはブラウザのプロキシ設定をすればOK。例えばFirefoxの場合であれば、[設定] - [詳細] - [ネットワーク] - [接続設定]から、"手動でプロキシを設定する"にチェックを入れて、SOCKSホストに127.0.0.1、ポートに1080番を入力してOKしてやる。
例えば、社内からしかアクセスできないはずのWebコンテンツが、http://192.168.1.100/work/ だったとしたら、このURLをアドレスに打ち込んでやれば接続可能となる。プライベートIPアドレスを打ち込んで接続できることに違和感があるかもしれないけれど、接続できてしまうので安心して欲しい。
sshのconfigを書いておくと便利
さて最後に、決まったホストによくsshするとして、ポートの指定が必要だったり、ユーザの指定をしたり、そもそもホストの名前が長かったり……要は毎回そんなのを入力するのが面倒くさいって話。そんな人は、zshの履歴を有効活用するか、sshのconfigを書いておくと便利になる。
例えば、とあるマシンから、chibilog.nameの2222番でリスンされているsshにchibiponユーザとして接続する場合、通常ならこんな感じでsshを実行する必要がある。
$ ssh -p 2222 chibipon@chibilog.name
面倒臭がりな人にしてみれば、これは長すぎるわけですよ。もし、秘密鍵なんかも特別な物を使わないといけないとなると、その指定もしないといけないわけだから、更に長くなるわけだし……そんなわけで、$HOME/.ssh/config を以下のように書いておく。
$HOME/.ssh/config
Host cn HostName chibilog.name User chibipon RSAAuthentication yes IdentityFile ~/.ssh/id_rsa Port 2222 Protocol 2 TCPKeepAlive yes ForwardX11 no
上記を書いておけば、以下のように実行すれば接続できる。
$ ssh cn
これでかなり楽になるはずだ。
- TB-URL http://chibilog.name/0656/tb/
