| MD5による認証 | 2003/02/18 (Tue) ▽ |
|
|
ハッシュ関数 MD5 (Message Digest 5) は、「一方向要約関数」ともよばれ、サイズ・長さの異なる文字列データを、固定長の数値(半角英数字32文字)に変換します。異なる文字列が同じ数値に変換されることはなく、また、数値から入力元の文字列を生成することも不可能です。 原文(テキスト)、配布ファイル(アーカイブ、圧縮ファイル、画像など)、通信データの”改ざん”の有無を検証する目的で使用されます。”原本作成者を問わない”電子署名とお考え下さい。 実際には、配布ファイルなどをダウンロード後、MD5による演算処理(MD5 チェックサム)にて得られた数値を、添付ファイル(ないしHTML表示)の数字と比較し、同一であることを確認します。 [例 MD5 checksum: e63add33e010b4245ba0841b21fe0bfe]
MD5 プログラムの入手
- http://www.fourmilab.ch/
zipファイル:本ユーティリティはコマンドラインで使用します。MS-DOS/Windows および Unix に対応しています。 展開後、MS-DOS プロンプトにて
C:¥>md5 -d[input_text | infile ] [ outfile ]
とします。-dの後には半角空白は入りません。 Unix系では、デフォルトでMD5使用可能となっているOSが多いと思います。もし、必要あれば、展開後、
% make
します。また、
- CERT Coordination Center
では、tar.Z ファイルをFTPダウンロードできますので、PGP電子署名をチェックし、展開用ディレクトリ(例 md5 )作成後
% mkdir md5 % cd md5 ファイル MD5.tar.Zをディレクトリ内にコピー後 % uncompress MD5.tar.Z % tar xvf MD5.tar % make
です。
- おすすめ Windows版⇒ MD5 basp_md5 + BASP21 DLL
Tatsuo Baba 氏のホームページで、ライセンスフリー BASP21 DLL(びーえーえすぴーにじゅういち) をダウンロードします。Windows NT 4.0 とWindows 95/98 で動作確認されています。次いで、 KemaSoftさんの「お気楽スクリプト」の1つ basp_md5_20011008.exe を実行します。展開後、basp_md5.hta を起動します。使用環境は Windows95/98/ME/NT4/2000 + IE5以上 + BASP21 とのことです。
|
|
| ftpでアクセスしたユーザーに ホームディレクトリ /home/ユーザー名/より上位のディレクトリを見せない(アクセスさせない)方法 | 2003/02/23 (Sun) ▽ |
|
|
ユーザーアカウントを提供されたサーバー内では、ホームディレクトリより上位でのユーザー権限は、通常、コピーのみ可能で書込みはできないことになっていますが、何らかのgroupに属していたり、パーミッション 777 のディレクトリがあれば、実行ファイルをアップロードしてroot権限を奪取することも可能です。 また、各ユーザーにホームページの開設サービスを許可していないサーバーであっても、メールアカウントのパスワードが通常の popアカウント であれば(apop認証やsmtp+apop認証でない)、ユーザーはftpでアクセスし、サーバー内を見てまわることが可能です。
パッケージ wu-ftpd-VERSION.tgz を入手します。 コマンド ftp(ないし,ブラウザ, ftpクライアントソフトにて) FTPサイト ftp.freebsd.org にアクセスし、/pub/FreeBSD/ に移動し、/ports or /release 内からダウンロードします。インストールはroot権限で、
# pkg_add wu-ftpd-VERSION.tgz
です。依存関係のあるパッケージを要求されることはない( FreeBSD 4.7-relaeseなど)ファイルサイズ 120KB程度の高機能フリーソフトです。 FreeBSD デフォルトのFTPサーバーも inetdを利用するデーモンシステム(要求があったときのみ起動し、常時作動していない)ですので、inetd 設定ファイルのPATH等1行を変更するだけで、切り替えが簡単にできます。
ftpaccess と ftpusers を作成・編集します
# cd /usr/local/etc/ # cp -ip ftpaccess.example ftpaccess # cp -ip ftpusers.example ftpusers # vi ftpusers
root,bin,nobody など"デフォルト"で12のユーザー名が列記されていますので、ホームディレクトリなどサーバー内に ftp アクセスさせないユーザー名を最下段に追記します。一名ずつ改行し入力します。
# vi ftpaccess
最下段(行)にある email user@hostname をサーバー管理者のメールアドレスに変更します。
更に、guestgroup useraaa
を追記します。
"useraaa" はホームディレクトリーより上位にアクセスさせたくないユーザー名です。一名ずつ改行し入力します。guestgroup 設定では、/etc/group の useraaa に複数のユーザー(たとえば、 useraaa:*:1001:useraaa,userbbb,userccc )が含まれていると、group useraaaの全員(useraaa,userbbb,userccc)がftpアクセス制限の対象となりますので、確認します。
guestuser useraaa userbbb userccc という入力も可能です。
次いで、ユーザー "useraaa" のホームディレクトリに必要なファイル、ディレクトリを設定し、パーミッションを変更します。
# mkdir /home/useraaa/bin # mkdir /home/useraaa/dev # mkdir /home/useraaa/etc
# cd /bin/ls # cp -ip ls /home/useraaa/bin/ # chmod -R 111 /home/useraaa/bin
# cd /etc/ # cp -ip passwd /home/useraaa/etc/ # cp -ip group /home/useraaa/etc/ # chmod 111 /home/useraaa/etc # cd /home/useraaa/etc/ # chmod 444 *
# cd ../dev/ # mknod zero c 3 12 # chmod 444 zero # chmod 111 /home/useraaa/dev
これら一連の作業を owner rootで実行しなかった場合、必ず最後に
# chown -R root:wheel /home/useraaa/bin # chown -R root:wheel /home/useraaa/dev # chown -R root:wheel /home/useraaa/etc とします。
ftpサービスのエントリを変更します。 # cd /etc/inetd.conf # vi inetd.conf
コメント# のない1行
ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l
を以下のように変更します。
ftp stream tcp nowait root /usr/local/libexec/ftpd ftpd -l -a
設定変更ファイルを"再読み込み"します。
# kill -HUP `cat /var/run/inetd.pid`
もし、再読み込みが不可能であれば(OSのバージョンによっては起こりうる)、
# ps ax | grep inetd
プロセスID (pid) を確認し、
# kill -TERM pid
# /usr/sbin/inetd -wW
とします。バッククオート[ ` ] の入力が正しくできないときは
# kill -HUP pid
とします。
|
|
| ”トロイの木馬”と バックドア検出ツール | 2003/02/25 (Tue) ▽ |
|
|
最近のサーバー攻撃の特徴は、「ポート」から侵入し、秘密の「バックドア」を作ることです。
ネットワークとサーバー間とのパケット通信に利用されるプロトコルは、TCP/IPプロトコルとよばれます。TCP/IPプロトコルのインターネット層には IP, ARP, ICMPなどが含まれ、トランスポート層には TCP, UDP があります。TCP/IPプロトコルに接続するための TCPポート、UDPポートはともに1〜65535 までの値があり、いくつかのポートは決まったサービスにのみ利用されます。サーバー攻撃者は、これらポートから不正侵入した後、内部にバックドア型 Trojan-Horses(トロイの木馬)とよばれるプログラムを設置します。その後、Trojanプログラムが作った ”裏口”を利用し、サーバーやOSをリモートコントロールします。 よって、セキュリティのためにポートチェックはもちろん大事ですが、たとえば、UNIX用のバックドア検出ツールの1つ chkrootkit をインストールし、定時的なチェックを行いましょう。 本ツールはソース Tarballを展開したディレクトリ内で作動しますので、展開先をまず決めます(例:/usr/local/src/)。必ず最新バージョンを使用します。
# cp chkrootkit.tar.gz /usr/local/src/ # tar zxvf chkrootkit.tar.gz # cd chkrootkit-0.39a # vi Makefile
FreeBSD では Makefile を編集します。 23行目のコメント # のみ削除します。
### FreeBSD or OpenBSD 2.x ### # If you have FreeBSD or OpenBSD 2.x, uncomment the next line ⇒ CFLAGS =
行頭 コメント# の削除後、make します。
# make sense
バックドア型プログラムの有無を定時的にチェックするように /etc/crontab を編集します。
# cd /etc/ # vi crontab 最終行にタブキーを用いて追記します。
0 3 * * * root (cd /usr/local/src/chkrootkit-0.39a; ./chkrootkit -q 2>&1) | mail -s "chkrootkit daily output messages" root
毎日3時にツールを実行し、root 宛てメール出力します。
注記) Windowsユーザーは、NetBEUI(NetBIOS Extended User Interface) というプロトコルもよく利用しますが、これは、NetBIOSをベースにしたもので、小規模なLAN、ネットワーク用です。 ネットワーク診断プログラム ping は ICMP(Internet Control Message Protocol : RFC792/ RFC1812)を使用します。 UDPプロトコルは、DNS(Domain Name System)、NFS(Network File System )、IP Messenger(Windows) に使用されています。
|
|
| Perl Scriptで書かれたCGIを使用するときの注意点 | 2003/03/02 (Sun) ▽ |
|
|
いくつかのサーバーを1台のPCで運用するときのperl+CGI WWWサーバー Apache 上でCGIを利用するときのセキリティ対策 も一読下さい。
Perlスクリプトで作成された 掲示板、送信フォーム、アクセスカウンター、アクセス解析、チャットなどのフリーソフトは、多くのサイトで容易に入手できます。これらスクリプトのインストールマニュアルには、通常「各ファイルをアップロード後、パーミッション CGI ⇒ [755]、 データファイル ⇒ [666] に変更する」と指定されていることが多いのですが、この設定では、データファイルは "すべて丸見え" となっています。
データファイル ⇒ [666](ないし [606])以外では作動しないサーバーでは、セキュリティ対策として、データファイルのファイル名やアップロード先のディレクトリ名を変更し、管理者以外の人に直接アクセスさせないようにしたり、平文で書かれた個人情報などをサーバー上に残さないなどの対策が必要です。
また、CGI本体ないし、設定ファイル(.dat ないし .cgi)の中に管理者専用パスワードを入力しますが、レンタルサーバーやプロバイダー(ISP)提供の Web サーバーを多くのユーザーが共有している場合、パーミッション CGI ⇒ [755] では、同一サーバーの他ユーザーやグループのアクセスが何らかの理由で可能になると、パスワードまで読み取られてしまいます。パーミッション CGI ⇒ [700] ないし [701] で作動しなければ、サーバー管理会社やISPは信頼できるところを選びましょう。
他に、ログファイルを自動生成するタイプの掲示板などでは、ログ用ディレクトリにも書込み権限が必要ですので、パーミッション ⇒ [777] (ないし [757], [707] )とすることになります。もし、画像掲示板などで、悪意ある攻撃者により実行ファイル類が "添付ファイル"用、"ログ"用ディレクトリにアップロードされると、Web 改ざんも可能となります。
パーミッション CGI ⇒ [700],[701] データーファイル⇒ [600] で作動しないサーバーは、安全とはいえないので、 安全なパーミッションで動作させる方法 をお伝えします。
- Apache サーバーに suEXEC をインストールする
正しくインストール・設定した「suEXEC対応」の Apache サーバーでは、CGIファイル [701] ログファイル [600] ディレクトリ [701] のパーミッションで動作するとのことです。suExec の実行は、[Webサーバー]と同じユーザーが CGI や SSI を実行するのではなく、異なる [ユーザー] に依頼し、[ユーザー] の権限で実行されます。Apache web サーバから呼び出される setuid された "wrapper" プログラムが基本となるそうです。
しかし、正しく設定されなかった suEXEC は、とても危険です。また、攻撃者が suidperl を悪用しパーミッションを設定すると同様のことが起こります。
Unix 由来のオペレーティングシステムでは、通常 setuid (suid・sbit), setgid (sgid) 操作が可能です。setuid, setgid されたコマンドやプログラムでは、コマンド操作した者が、(それぞれ)所有者、所有グループの権限で実行できるようになります。 suidperlが実装されたサーバーにおいて、ホームディレクトリにアクセス後、
% chmod 04701 [perlスクリプト] (chmod u+s も使用可)
このように setuid すると、誰でも perlスクリプト(CGIなど)を実行できるようになります。
% ls -la
-rws-----x 1 所有者名 ------ [perlスクリプト]
setgid する方法は、
# chmod 02751 [perlスクリプト] (chmod g+s も使用可) です。
# ls -la -rwxr-s--x 1 所有者名 所有グループ名 ------ [perlスクリプト]
と「s」という文字で表示されるようになります。
なお、自宅サーバー内では、デフォルトで setuid, setgid されたコマンドをチェックする方法として、
% find / -type f (-perm -u+s -o -perm -g+s ) -ls または、 % find / -type f (-perm -04000 -o -perm -02000 ) -ls
があります。オプション -type f はファイルタイプがファイルのもののみ表示するようにしています。ルートディレクトリ以下のすべてをチェックしますが、検索のためにサーバーに負担をかけます。
また、
% ls -l /{,usr/,usr/local/}{,s}bin/ | grep 'r[-w]s'
でも /usr/以下の指定ディレクトリがチェックできます。
実際には、passwd,chpass,login,man,procmail,rcp,ping,traceroute,shutdown,crontab などが setuid されています。
owner 所有者 = root のファイルが setuid されると、最も危険な存在となることがお分かりいただけると思います。また、group グループ = 0 ないし wheel のファイルは FreeBSDでは コマンド su を使用できますので、setgid されると同様に危険です。
このため、Webサーバー管理のため、ファイルシステムのマウント時に、mount(8) の nosuid オプションを指定し、setuid / setgid を無効とする方法があります(下表 /usr/ports /var/www ⇒Webサーバーを設置したところ)。
フリーソフト CGI にセキュリティ上のバグがあると、setuid(suid・sbit) された perl スクリプトと同様に非常に危険なものとなります。攻撃者によって、Web ページ"改ざん"など可能となります。
# vi /etc/fstab
--------- # Device Mountpoint FStype Options Dump Pass#
/dev/ad0s1bnoneswapsw0 0 /dev/ad0s1a / ufs rw 1 1 /dev/ad0s1c /usr ufs rw 2 2 /dev/ad0s1d /usr/ports ufs rw,nosuid 2 2 /dev/ad0s1f /var ufs rw 2 2 /dev/ad0s1g/var/www ufs rw,nosuid 2 2 /dev/acd0c /cdrom cd9660 ro,noauto 0 0 proc /proc procfs rw 0 0
----------- マウント時に、mount コマンドでマウントオプション
# mount -o nosuid device mountpoint
でも設定可能です。
|
|
| ミラーリング | 2003/03/16 (Sun) ▽ |
|
|
バックアップツール rsync は、とくに同期機能に優れたオープンソースのフリーソフトです。リモートホスト間で ssh による暗号送信を利用し、rsync コマンド を cron で実行させると、複数サーバのファイルの同期(ミラーリング)が容易です( sshの解説もご一読ください)。
rsync.samba.orgのダウンロードサイトから、最新版を入手します(03/03/16現在 rsync-2.5.6.tar.gz) 。 インストールはとても簡単です。
% tar zxvf rsync-VERSION.tar.gz % cd rsync-VERSION % ./configure % make % su # make install
テストを兼ねて、同じハードディスク内の(別)パーテーションにコピーを行います。/home 内のディレクトリ www を /tmp の wwwbakディレクトリに コピーする場合、
コピー先のディレクトリを作成し、root以外のアクセスを禁止します。
# mkdir /tmp/wwwbak # chmod 700 /tmp/wwwbak
rsync はいくつかのオプション設定がありますが、通常
% /usr/local/bin/rsync -az --delete --exclude '*~' /home/www/ /tmp/wwwbak/
となります。
-a : アーカイブモード。ディレクトリ内に含まれる全てのファイル、下位ディレクトリを、シンボリックリンク、パーミッション属性、グループ属性、所有者属性、タイムスタンプなどすべて保持した状態でコピーします。 -z : ファイルを圧縮しながら転送しますので、リモートホスト間では z オプションを使用します。 -u : 差分のみのコピー( update )で、コピー先がより新しければ、更新されません。 --delete : 転送元のディレクトリに存在せず、転送先のディレクトリにのみあるファイルを削除します。このオプションは、2回目以降の転送から付けますが、もし転送先のディレクトリ名を誤ると、重要なファイルが一瞬に削除されます(Unix系では、消失ファイルの復旧はできません)ので、確信がなければ使用しないで下さい。 '*~' とは、muleで作成した ~ で終わるファイルのことです。
-e ssh :ファイル転送を暗号化します(後述)。 -c : 転送時 checksum を行います(後述)。
なお、コピー元を /home/www ← / がないとすると、 % /usr/local/bin/rsync -az --delete --exclude '*~' /home/www /tmp/wwwbak/ www ディレクトリそのものがコピーされますので、コピー先では /tmp/wwwbak/www/ となります。
コピーに成功すれば、次に /etc/crontab を編集します。
0 5 * * * root /usr/local/bin/rsync -auz --delete --exclude '*~' /home/www/ /tmp/wwwbak/
毎朝5時に差分更新ファイルのみ転送します。
時間指定の転送に成功すれば、ローカルネット内、リモートホスト間のマシンに転送します。 この場合、バックアップ先のマシンにも、rsync をインストールする必要があります。また、ssh を利用せずに rsh での転送も可能ですが、平文(ひらぶん)でパスワード、データが送信されますので、おすすめできません。ssh でログインできる環境を準備して行って下さい。バックアップ先をローカルマシン内で行うときは、ハードディスクを増設するとよいです。
オプション -e ssh では ssh によりファイル転送し、パスワード認証もすべて暗号化されています。-e ssh と --rsh=ssh とは同じオプションです。
% /usr/local/bin/rsync -az -e ssh --delete --exclude '*~' /home/www/ user@remotehost:/home/wwwbak/ 2回目以降、 % /usr/local/bin/rsync -auz -e ssh --delete --exclude '*~' /home/www/ user@remotehost:/home/wwwbak/
です。 もし、コピー元とコピー先のファイルサイズを厳密にチェックするときは、オプション -c を追加します。
% /usr/local/bin/rsync -auc -e ssh --delete --exclude '*~' /home/www/ user@remotehost:/home/wwwbak/
最後に /etc/crontab を編集します。
 0 5 * * * root /usr/local/bin/rsync -auc -e ssh --delete --exclude '*~' /home/www/ user@remotehost:/home/wwwbak/
|
|
|