LPIC-1 - 102試験 - 110:セキュリティ - 110.1 セキュリティ管理業務を実施する

Last Update : September 18 2014 21:34:19

     

a. システムセキュリティ

1.ユーザーが使用できるリソースを制限する [ ulimit ]

ulimit コマンド(Cシェル系はlimitコマンド)を使用することで、ユーザーが使用できるプロセスなどのリソースを制限することができます。ユーザーの故意による誤操作やプログラムのバグ、悪意のあるユーザーによるリソースの消費などを回避することができるようになります。まず、現在のメモリ制限を確認するには、-a オプションを指定して実行します。unlimited となっている箇所は文字通り、「無制限」という意味になります。

# ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited file size (blocks, -f) unlimited max locked memory (kbytes, -l) unlimited max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 2047 virtual memory (kbytes, -v) unlimited

メモリ制限を行なうには、-m <サイズ(KB単位)> を指定します。以下の例では一人当たりのメモリ容量の制限を64MBに設定した例です。

# ulimit -m 65536 # ulimit -a | grep max.m max memory size (kbytes, -m) 65536

元に戻すには、以下のように実行します。

# ulimit -m unlimited


b. ネットワークセキュリティ

1.不要なサービスポートの確認

nmapを使用して現在立ち上がっているサービスポートを確認し、その中で不必要と思われるサービスは停止させておきます。 まず、OpenSSHサーバーを立ち上げているならば、telnet、rlogin、rcp、rsh、ftp に関してはOpenSSH で代用ができるので停止させてしまいましょう。111番ポートのsunrpc は、NFSの基礎として使用されており、外部ネットワークに対して開かれていると非常に危険で侵入される可能性も高くなるので停止させておきましょう。sunrpcを停止させるには、portmap を停止させます(chkconfig --level 345 portmap off )。

# nmap localhost
Starting nmap V. 3.00 ( www.insecure.org/nmap/ ) Interesting ports on ns1.click-rescue.com (127.0.0.1): (The 1589 ports scanned but not shown below are in state: closed) Port State Service 21/tcp open ftp 22/tcp open ssh 23/tcp open telnet 25/tcp open smtp 53/tcp open domain 110/tcp open pop-3 111/tcp open sunrpc 953/tcp open rndc 3128/tcp open squid-http 3306/tcp open mysql 5432/tcp open postgres 8080/tcp open http-proxy

2.必要なサービス

まず、サービスを起動しておいた方が望ましいサービスについて以下に列挙します。

 network TCP/IPネットワーク
 xinetd スーパーサーバー
 random 乱数発生。SSLをサポートする場合に必要となる
 syslog システムのログを管理する
 crond 定期的なジョブを実行する
 anacron cronの機能をサポートする
 keytable キーマップをロードする
 kudzu システム起動時に新しいハードウェアを検出する
 iptables ネットワークセキュリティツール
 rawdevices 「Raw」デバイスのサポート


3.不要なサービス(必要に応じて起動させる)

基本的には必要がないと思われるサービスを列挙します。各自の環境によって必要と思われるものは随時、起動させるようにしてください。

 netfs /etc/fstabに記述してあるNFS、SMB、NCPなどのネットワークファイルシステムをマウントする
# chkconfig --level 345 netfs off
 apmd 電源管理を行うAPMデーモン
# chkconfig --level 2345 apmd off
 atd atコマンドにより、時間を指定してプログラムを実行する
# chkconfig --level 345 atd off
 gpm コンソールでのマウスエミュレータ
# chkconfig --level 2345 gpm off
 autofs 自動でマウントするデーモン
# chkconfig --level 2345 autofs off
 irda IrDA赤外線通信デバイスの制御サービス(デフォルトoff)
 isdn ISDN用接続スクリプトサービス。ISDNを使用しているのでなければ停止する。
# chkconfig --level 2345 isdn off
 portmap リモートプロシージャコールのポートを管理(NFSサーバーで利用)
# chkconfig --level 345 portmap off
 nfs ファイル共有を行うNFS(Network File System)サーバー(デフォルトoff)
 nfslock NFSでファイルのロックを行う
# chkconfig --level 345 nfslock off
 sendmail 電子メールサーバー。他メールサーバーを使用しているならば停止させる。
# chkconfig --level 2345 sendmail off
 rhnsd RedHatに接続し、アップデートがないか定期的にチェックする
# chkconfig --level 345 rhnsd off
 xfs XFree86用のフォントサーバー。X-Windowを使用していなければ不要。
# chkconfig --level 2345 xfs off
 canna カナ漢字変換
# chkconfig --level 2345 canna off
 FreeWnn カナ漢字変換
# chkconfig --level 2345 FreeWnn off
 lpd
ラインプリンタデーモン。プリントサーバーでないのなら不必要。

4.xinetd ベースのサービス

xinetd を介して起動されるサービスで不要と思われるものは停止しておきましょう。特にtelnet は外部に対してサービスを稼動させるのは厳禁です。

 chargen-udp デバックなどで利用するキャラクタージェネレーター[ UDP ](デフォルトoff)
 rsync ファイルの同期を行う(デフォルトoff)
 chargen デバックなどで利用するキャラクタージェネレーター[ TCP ](デフォルトoff)
 daytime-udp 日時を通知する[ UDP ](デフォルトoff)
 daytime 日時を通知する[ TCP ](デフォルトoff)
 echo-udp pingコマンドへの応答[ UDP ](デフォルトoff)
 echo pingコマンドへの応答[ TCP ](デフォルトoff)
 time-udp timeプロトコル[ UDP ](デフォルトoff)
 time timeプロトコル[ TCP ](デフォルトoff)
 dbskkd-cdb RedHatに接続し、アップデートがないか定期的にチェックする
 sgi_fam ファイルやディレクトリの変更を知らせるサービス。使用していないのであれば停止させておく。デフォルトではon
# chkconfig sgi_fam off
 telnet Telnetサービス。停止した方が望ましい。(デフォルトoff)


5.待機しているポートの確認

netstatコマンドを使って待機しているポートを確認しておくことで不必要なサービスが稼動していないか調べることができます。もし、不必要なサービスが稼動していれば必要に応じて停止させておきましょう。

# netstat -an | more
Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 127.0.0.1:10024 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:10025 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN tcp 0 0 172.16.50.2:53 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:3128 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN



c. sudo

sudo は一般ユーザに特定のコマンドを実行させるためのものです。一般ユーザ権限では実行できないコマンドを、あるユーザだけには許可したいが、root 権限を与えたくはない場合に使います。また、誰がどういうコマンドを実行したかは /var/log/messages や /var/log/syslog に記録されます。
sudo の設定ファイルは /etc/sudoers ですが、このファイルを直接編集してはいけません。visudo というファイル編集用のコマンドがあるので、それを使います。


1.sudo のインストール

sudo はほとんどのLinuxディストリビューションにはデフォルトでインストールされています。以下のコマンドを実行してsudo がインストールされているかどうかを確認してください。

# rpm -qa | grep sudo
sudo-1.6.7p5-2

インストールされていなければyum もしくは、apt-get を利用してインストールしておきましょう。

# yum install sudo
or
# apt-get install sudo


2.sudo の基本的な使い方

sudoコマンドは、なにも設定していない状態では一般ユーザはデフォルトで使用できないようになっています。試しにroot しか閲覧することのできない/var/log/messageをsudo コマンドを実行して見ようとするとパスワードの入力を求められ、どのようなパスワードを入力してもコマンドは以下のように失敗してしまいます。このログインの失敗は、/var/log/message に書き込まれます。

$ sudo tail /var/log/messages
Password:
Sorry, try again.
sakura is not in the sudoers file. This incident will be reported.

それでは実際に一般ユーザに対してsudo コマンドが使用できるように設定していきます。設定ファイルは、/etc/sudoers になりますが、このファイルを絶対に vi で編集しないようにしてください。このファイルの設定ミスなどをしてしまうと思わぬトラブルを引き起こしかねないので、sudoersファイルのロックや構文チェックを行ってくれる visudo というコマンドが用意されています。visudo コマンドを実行すると、viが立ち上がり編集できるようになります。以下のように記述すると一般ユーザに対して全てのroot 権限が与えられます。具体的には、「ユーザーsakuraは、すべての接続元(ALL)から、すべてのユー ザー権限(ALL)で、すべてのコマンド(ALL)を実行できる」という意味になります。

# visudo
%sakura ALL=(ALL) ALL <---sakura に全てのroot 権限を与える

書式: ユーザID ホスト=(権限) コマンド

ユーザには、sudo権限を与えたいユーザー名を記述します。今回の例ではsakuraにする。
ホストには使用したいホストを書きます。一般的にはALLと書きます。
権限には「誰の権限でコマンドを実行したいか」を書きますが、ここも一般的にはALLにします。
コマンドにはsudoで扱えるコマンドを絶対パスで指定します。複数指定する場合は,(カンマ)で区切ります。

※visudo の構文チェック
編集し終わると、visudoが勝手に文法チェックを行ない、エラーが出た場合はエラーが出た行番号を表示し、どうするか聞いてきます。
e を押せば再編集ができ、x を押せば編集せずに終了します。q を押せば編集を保存して終了するため、q を押すのは本当にエラーが無くなったときにします。
構文ミスがあると以下のように知らせてくれます。「e」をタイプすれば再編集することが出来ます。

Warning: undeclared Host_Alias `LOCAL' referenced near line 24 >>> sudoers file: syntax error, line 23 <<< What now? Options are: (e)dit sudoers file again e(x)it without saving changes to sudoers file (Q)uit and save changes to sudoers file (DANGER!)

編集し終えたら、一般ユーザで再ログインしてからもう一度/var/log/message を見てみましょう。これでファイルが正常に閲覧できるようになります。なお、最初にsudo を実行した時に限り、パスワードを聞かれますが一定の時間内(デフォルト:5分以内)であれば次のコマンド実行時からはパスワードを聞かれなくなります。この時に入力するパスワードは一般ユーザのパスワードであるため、いくらSSHを使っているとはいえ、ネットワーク上にroot のパスワードが流れなくなるという点では、セキュリティの強化が図れます。

$ sudo tail /var/log/messages
Password: 現在ログインしているユーザのパスワードを入力

次にHost_Alias を設けてローカルネットワーク( 192.168.0.0/24)に存在するsakura のみに全 root 権限を与えるように設定します。また、「NOPASSWD」を用いることでパスワードなしでsudo を実行することもできます。「LOCAL」は定義名なので自由な名前を付けられますが、英大文字でなければならない等の一定のルールがありますので注意してください。

# visudo
# Host alias specification Host_Alias LOCAL = 192.168.0.0/24  <---あるいは、特定のIPアドレスに限定する or Host_Alias LOCAL = 192.168.0.2  <---あるいは、特定のIPアドレスに限定する # User privilege specification %sakura LOCAL=(ALL) NOPASSWD: ALL 

3.エイリアス機能

上記でもHost_Alias を使用して実例を見てみましたが、sudoers のエイリアス機能には以下の4種類があります。定義名は、大文字のA-Z、数字、アンダーバー(_)を使用します。そして先頭文字は必ずA~Zで始まる必要がありますので注意してください。

 User_Alias ユーザー名の別名を定義する
例)User_Alias WEBMASTER = koro, hoge, foo
 Runas_Alias 実行ユーザー名の別名を定義する
例)Runas_Alias OP = root, operator
 Host_Alias 接続元ホストの別名を定義する
例)Host_Alias LOCAL = 192.168.0.0/24
例)Host_Alias INTERNET = 172.16.0.1, 172.16.0.2
 Cmnd_Alias 実行するコマンドの別名を定義する
例)Cmnd_Alias SHUTDOWN = /sbin/halt, /sbin/shutdown, \
/sbin/poweroff, /sbin/reboot, /sbin/fastboot, /sbin/init

実際にエイリアス機能を使用して特定コマンドだけを使用できるようにすることもできます。以下のsudoers の例では、ファイル削除のrm コマンドだけをsakuraユーザに与えていることになります。ここで留意しておきたいのは、rmコマンドだけしか使えなくなるというわけではなく、sudoしてから実行できるコマンドがrm しかなくなるという意味になります。つまり、ユーザsakuraは一般ユーザ権限の範囲内では、cp やmakdir 等のユーザーコマンドは全て使用することができ、プラス、rootでしか削除できないファイルをsudoから実行して削除できる権限(rm コマンド)を得たということです。

# visudo
# Cmnd alias specification Cmnd_Alias RM /bin/rm # User privilege specification %sakura ALL=(ALL) RM

逆に、システムの停止・再起動の権限をsudoから実行できないようにすることもできます。Cmnd_Alias で設定した定義のSHUTDOWNの前に打ち消しの意味を持つ「!」をつけると、「SHUTDOWNは実行できない」という意味を持ちます。システムの停止や再起動時には、「sudo su」や「sudo -s」を実行して、root のシェル権限を得てから慎重に行うのがベストでしょう。

# visudo
# Cmnd Alias SHUTDOWN = /sbin/halt, /sbin/shutdown, \ /sbin/poweroff, /sbin/reboot, /sbin/fastboot, /sbin/init # User privilege specification %sakura ALL=(ALL) ALL, !SHUTDOWN

● sudo コマンドオプション
 -l 現在の設定状況を表示する
 -s sudo su と同等の意味になる。root のシェルを実行する

4.sudoのパスワードキャッシュ

先ほども触れましたが、sudo 実行後、一定の時間内であればパスワードを再入力することなく続けてコマンドを実行することができます。このキャッシュタイムアウトは、sudoを実行するたびに更新されます。しかし、この一定の時間内(デフォルトでは5分)というのが問題になる場合もきっとあるでしょう。うっかり席を立ってしまい、その5分以内の間に悪質なユーザにシェルをいじられ重要なファイルを盗まれたり、削除されたりしないとも限りません。自宅サーバーで運用している限りはその心配はほとんどなさそうですが、企業レベルの運用となると少し不安が残ります。なので、このタイムアウトをなくして、sudo を実行するたびにパスワードが聞かれるようにする方法も頭の片隅にいれておきましょう。記述は簡単です。キャッシュタイムアウトを10分に伸ばしたければ値を「10」にします。また、パスワードプロンプトもよりわかりやすいように改良しておきましょう。デフォルトのパスワードプロンプトでは、「Password:」と味気ないものですが、これをログインユーザとホスト名が表示されるように変更しておきます。

# visudo
Defaults timestamp_timeout = 0 <---パスワードキャッシュの時間(分単位) Defaults passprompt = "%u@%h Password: " <---パスワードプロンプトの変更


d. ユーザーの切り替え

一般ユーザーで作業をしていてrootの権限で実行したいとき、またrootユーザーでログインしているが、一般ユーザーでの権限を確認したい時など、ログオフ・ログインをいちいちしなくてもユーザーを切り替えることができます。 それが su コマンドです。

● su コマンド構文
  su [- ユーザー]

ユーザーを省略するとrootのことになります。

一般ユーザーからrootユーザーに一時的に変更するには、
$ su パスワード:  <--- rootのパスワードを入力する

一般ユーザーから他の一般ユーザーに一時的に変更するには、
$ su - sakura パスワード:  <--- sakuraのパスワードを入力する


z. 出題範囲概要

●主要な知識範囲
システムを監査して、SUID/SGIDビットが設定されているファイルを探す
ユーザのパスワードおよびパスワードエージング情報を設定または変更する
nmapおよびnetstatを使用して、システムの開いているポートを見つける
ユーザのログイン、プロセス、メモリ使用量の制限を設定する
基本的なsudoの設定および利用方法
●重要なファイル、用語、ユーティリティ
find, passwd, lsof, nmap, chage, netstat, sudo, /etc/sudoers, su, usermod, ulimit


  [ 例題 ] 
  1. 102:110.1 問01  ネットワークのポートの状態
  2. 102:110.1 問02  通信ポートの状況
  3. 102:110.1 問03  システムリソースの量を制限
  4. 102:110.1 問04  SUIDされているファイル
  5. 102:110.1 問05  rootユーザに切り替えるためのコマンド


     

www.it-shikaku.jp