ASHでは、セキュリティ対策の基本方針を決めた上で、アクセス制限、ファイアウォール構築、暗号化の順に、対策を実施しています。
3段階に分けて対策することにより、情報を整理することができるため、わかりやすくなります。
セキュリティを堅くすると、それだけ使い勝手が悪くなってしまいます。つまり、安全性と利便性は、相反するものなのです。ですから、何が必要で、何が必要でないかを明確にすることが重要です。
セキュリティの設定は、基本的にすべて禁止し、必要なものだけを許可するようにします。
提供するサービスは、必要最低限とするべきですから、必要なサービスを明確にします。
サービスを提供する対象者は、限られた人にだけとするべきです。
セキュリティの設定を考える場合、サービスの種類とアクセス方向を考える必要があります。
アクセス方向とは、内から外へのアクセスか、外から内へのアクセスかということです。一般的に、内から外へのアクセスよりも、外から内へのアクセスの方が危険度が高いです。
ただし、内から外へのアクセスも、内部犯行の場合や、踏み台にされた場合などを考えると、必要最小限とすべきです。
ASHのような、小規模ネットワークのセキュリティポリシーの方針を立てる際の前提を「インターネットには悪人がいっぱい」、「ローカルネットは善人ばかり」とします。
この前提では、インターネット側からの攻撃は防ぎますが、ローカルネットからの攻撃に対しては無防備ということになります。
一般的に、SOHOレベルの小規模ネットワークでは、見ず知らずの人物がローカルネットを使用することはほぼなく、ローカルネットからの攻撃はまずありえないと考えられるので、これで問題はないでしょう。
具体的には、以下のようになります。
外 | DNSサーバ |
---|---|
内 | Webサーバ、Ftpサーバ、Mailサーバ、Popサーバ ファイルサーバ、ダイアルアップサーバ |
プロトコル | 外->内 | 内->外 |
---|---|---|
Web | Webサーバのみ可 | 可 |
Ftp | Ftpサーバのみ可/ユーザ限定 | 可 |
telnet | 各種サーバのみ可/ユーザ限定 | 不可 |
Mailサーバのみ可/ユーザ限定 | 不可 | |
Pop | Mailサーバのみ可/ユーザ限定 | 不可 |
アクセス制限は、それぞれのマシンだけでも対応できるセキュリティ対策ですので、必ず実行しましょう。
不要なサービスを停止したり、ルータやサーバのフィルタ機能を利用してアクセス制限を実施します。
inetdは、各種サービスを起動するためのデーモンです。
デーモンとは、Linuxでイベントが発生するまで待っているプログラムのことです。
/etc/inetd.confの設定を変更することにより、不要なサービスを起動しないようにします。
fingerなどは、内部の情報が漏れるので、できるだけ停止しましょう。
それから、ユーザやパスワードによる認証を行わずに通信する、UDP系のNFSやRPC(rsh)も、できるだけサービスを停止しましょう。
/sbin/rc.dや、/etc/rc.d 配下の起動ファイル内をコメント化し、不要なデーモンが起動しないようにします。
rc.d 配下のファイルは、シェルで記述されているので、各行の先頭に # を付加することで、コメント化できます。
TurboLinuxでは、turboserviceコマンドで、RedHatでは、ntsysvコマンドで、不要なサービスを停止させたり、起動しないようにできます。
また、特定のユーザに対してのみサービスを提供する場合は、ポート番号を変更し、デフォルトのポートを閉じてしまう方法があります。 デフォルトのポート番号から変更することで、そのポート番号を知っている人しか、アクセスできないようにすることができます。 さらに、パスワードと同じく、ポート番号を定期的に変更するのも有効です。 ただし、ポート番号を指定できない一部のクライアントソフトでは、動作しなくなる場合がありますので、注意が必要です。
パケットフィルタリングとは、サービスの種類(ポート番号)と、アクセス先とアクセス元(IPアドレス)によってアクセスを制限する機能です。
フィルタリングでは、パケットのヘッダ部でのみチェックするため、パケットの内容は一切チェックしません。
ほとんどのルータには、このフィルタリング機能が付いています。
また、Linuxでは、tcp_wrapper が、デフォルトでインストールされています。
しかし、デフォルトではアクセス制限がかかっていない場合もありますので、ちゃんと設定する必要があります。
ログインできるユーザは、最小限とし、不要なアカウントは、ログインを禁止します。
ただ、ユーザ数を減らすために、複数の人が共同で利用する共通アカウントを作成してはいけません。
共通アカウントは、パスワードが漏れやすく、アクセスしたユーザが特定できないという問題があります。
また、rootなどの管理者ユーザは、ネットワークから直接ログインできないようにします。
ネットワークから管理者コマンドを使用する場合は、一般ユーザでログイン後、suコマンドを使用します。
これらは、/etc/login.accessなどで設定します。
suコマンドで、rootになれるユーザは、wheelグループだけとします。
これらの設定は、/etc/login.defsなどで、設定します。
FTPできるユーザは、必要最小限とします。
rootでは、ftpできないようにします。
これらは、/etc/ftpusersなどで設定します。
一般ユーザが、参照・更新できるファイルは、必要最小限とします。
/sbin、/usr/sbin、/usr/local/sbinディレクトリは、システム管理者のコマンドを格納するディレクトリですから、ディレクトリ単位で参照できないようにします。 また、telnet, traceroute, pingなどのネットワーク関係のコマンドも、必要がなければ、一般ユーザからは実行できないようにします。
ファイアウォールとは、ローカルのネットワークをインターネットなど他のネットワークを経由した攻撃から防ぐ目的で設置する、文字通り「防火壁」です。
専用のハードウェアなどもありますが、高価なものが多いのが難点です(最近では安価なものも出てきてはいます)。
しかし、Linuxとフリーソフトを用いてファイアウォールを構築することもできます。
フリーソフトでも、一定レベルの安全性を求めることは十分に可能です。
ファイアウォールを構築するには、インターネットとローカルネットを論理的に切り離し、直接アクセスを出来なくする必要があります。
ゲートウェイマシンとは、複数のLANボードを入れ、内部ネットワークと外部ネットワークを接続するマシンのことです。
そして、ゲートウェイ・マシンにファイアウォールを構築して、セキュリティ上問題のあるデータを食いとめます。
そして、ゲートウェイ・マシンを使って、外部のインターネットと通信するには、必要なサービスのデータを中継する必要があります。 中継とは、グローバルなIPアドレスとローカルなIPアドレスを対応させて、書き換えて通信することです。 ゲートウェイを使って、中継する方法には、以下の種類があります。
ゲートウェイ上で、パケットレベルのフィルタリングを行い、データを中継するのが、サーキットレベルゲートウェイです。
サーキットレベルゲートウェイでは、フィルタリングと同じく、サービスの種類(ポート番号)と、アクセス先とアクセス元(IPアドレス)によってアクセスを制限します。パケットのヘッダ部でのみチェックするため、パケットの内容は一切チェックしません。
ASHでは、サーキットレベルゲートウェイとして、SOCKS5を使用しています。
SOCKS5とは、米NEC社で開発されたもので、TCP/IPレベルでデータの中継を行うものです。
ICQなどのツールをファイアウォール越しに動作させる場合などに必要になります。
また、VPN(Virtual Private Network)という機能で、インターネット越しに、仮想的なプライベートネットワークを構築することも可能です。
ゲートウェイ上で、アプリケーションレベルのフィルタリングを行い、データを中継するのが、アプリケーションレベルゲートウェイです。
アプリケーションレベルゲートウェイでは、ftpやpopやtelnetなどのコマンドを認識し、不正なコマンドは中継しないようにすることができます。
ただし、アプリケーション毎にきめ細かい制御ができる反面、中継ソフトが各アプリケーションに対応している必要があります。
ASHでは、アプリケーションレベルゲートウェイとして、DeleGateを使用しています。
Delegateは電総研が開発した多機能プロキシです。
ローカルネットからインターネットにアクセスするためのプロキシサーバー機能と、ローカルネットのデータをインターネットに公開するためのマウント機能があります。
対応しているプロトコルには、HTTP, Gopher, Whois, FTP, Telnet, NNTP, SMTP, POPなどがあり、TCP/IPのほとんどの中継処理をこれで行うことが可能です。
また、httpデータのキャッシュ機能や、各アクセスに対してアクセス制限機能や、ログの採取機能などがあります。
メールの中継は、双方向に対して同じポート番号で中継する必要があるため、専用のアプリケーションを使います。
ASHでは、メールの中継には、ゲートウェイのsendmailを使用して、転送しています。
データに対する脅威を防ぐためには、第三者に見られても内容が分からないようにし、改ざんされたかのチェックをし、また、相手が本当に目的の相手なのかを確かめなければなりません。
第三者に見られても内容が分からないようにするためには、通信データの暗号化という方法があります。この暗号化には、共通鍵暗号方式(暗号化と復号化に共通の鍵を使う方式)と、公開鍵暗号方式(暗号化と復号化に別々の鍵を使う方式)があります。
通信データの書き換えが行われていないか調べるためには、メッセージ認証を使って、通信データは途中で改ざんされていないかを調べる方法があります。メッセージ認証には、ハッシュ関数などを使います。また、デジタル署名を付けることにより、認証する方法もあります。
相手が本当に目的の相手なのかを確かめるためには、認証局の署名付き証明書を相手に送り、確認してもらう方式があります。つまり、自分の身元を信頼できる第三者に保証してもらうことで認証を行うわけです。認証局の署名付き証明書とは、自分の公開鍵等の情報を認証局の秘密鍵で暗号化したものを使ったりします。
暗号化は、盗聴を防ぐことができます。
メッセージ認証は、データの改ざんを防ぐことができます。
認証局による認証やデジタル署名によって、なりすましを防ぐことができます。
SSHは、Secure SHellといって、telnet、ftpの代わりとして利用できる暗号化ツールです。 SSHは、telnetやFTPと操作方法は異なりますが、rsh、rcpなどの、R系のコマンドと操作は同じです。 telnetやftpなどは、暗号化されないため盗聴される可能性があるだけでなく、パスワードもそのまま送信していますので、注意しましょう。
SSLとは、Secure Sockets Layerの略で、Webサーバとブラウザ間を安全に通信するため、Netscape社が提唱した通信手段(プロトコル)です。
機能としては、データの暗号化通信、通信相手を特定するための認証、通信データの書き換えが行われていないか調べるメッセージ認証の3つがあります。
現在、Netscape NavigatorやInternet Explorerなどに 実装されていますが、HTTPプロトコルのみ対象しているのではないので、TELNETやFTPなど他のプロトコルにも実装することが可能です。
SSLを利用して、Webデータを暗号化して転送する場合、一般にhttpsポート(443)を使用し、httpsサーバを立ち上げる必要があります。
ApacheなどのフリーのWebサーバでhttpsサーバを立ち上げるには、openSSLや、SSLeayなどのアプリケーションと、Apache+SSLのパッチが必要となります。
URLは、https://www.server.name/ のようになります。
PGPは、Pretty Good Privacyの略で、メールなどのデータの暗号化をするためのツールです。
PGPの暗号化では、公開キーと秘密キーがセットになっています。公開キーで暗号化したデータは、対応する秘密キーでしか解読できません。また、秘密キーで暗号化したデータは、対応する公開キーでしか解読できません。
ですから、暗号化して通信したい人は、ホームページ上で公開キーを公開するか、メールなどで公開キーを送り、その公開キーで暗号化するように依頼することで、暗号化して通信することができます。また、自分の作成したドキュメントを秘密キーにより暗号化し、公開キーと共に公開することで、そのドキュメントが改ざんされていないことを証明することもできます。
公開キーは、ホームページに公開したり、メールに添付しても問題はありません。
もし、改ざんされた場合は、解読できなくなるだけです。
MD5は、メッセージダイジェスト関数、または、ハッシュ関数と言い、データを要約したチェックサムのようなものです。 メッセージダイジェスト関数は、暗号化とは異なり、データのチェックにしか使えませんが、非常に高速であるという特徴があります。