いますぐ実践! Linuxシステム管理

いますぐ実践! Linux システム管理 / Vol.257 / 読者数:2574名

こんばんは、うすだです。

前回発行後、複数の方から、助言や感想をいただきました。

1ヶ月間があいて心配されたのか、 こんなメルマガでも自然消滅するなよと思われたのか、理由はわかりませんが、 なにはともあれフィードバックをいただけるのは、ありがたいことです。 ありがとうございます。

いただいた助言に関しては、宿題の答えで紹介させていただきます。

そして、今回感想をいただいて思ったのが、 こちらが想定していない読み方をされている、ということでした。

一応、読者の方の年齢やレベルを(勝手に)想像して、 それに合わせて中身を書いています。ですが、それとは直接関係のない、 くだらない話や言い回しなどに、面白さを感じていただいているようです。

というわけで、これからも、本題以外のどうでもいい箇所に、 力を入れていきたいと思います。

…はい、もちろん、冗談です。

…が、半分くらいは本気ということで、今回もはりきってまいります…。

今回のお題 - Nmap でセキュリティをチェックする (レベル:初級)

巷では、OpenSSLの「Heartbleed脆弱性問題」で賑わっているようです。

The Heartbleed Bug
http://heartbleed.com/
巷を賑わすHeartbleedの脆弱性とは?! - Mobage Developers Blog
http://developers.mobage.jp/blog/2014/4/15/heartbleed

ですが、こういう脆弱性を、一般庶民が自力で見つけて事前に対処するといったことは、 ほぼ不可能です。
情報が公開されたら、可及的速やかに対処するしかありません。

それよりも、アクセスの制限が緩く、情報が漏洩したりすることの方が、 圧倒的に多いのではないでしょうか。

弊社の場合、各所でフィルタを設定しているし、 サービスレベルでも制限をかけているから大丈夫、と思われるかもしれません。

そういう場合でも、一応、確認しておいてもよいのではないでしょうか。
というわけで今回は、非常に月並みではありますが、「Nmap」を使って、 その確認をしたいと思います。

Nmap とは?

Nmap(Network Mapper) とは、ネットワーク上のサーバやサービスを発見したり、 セキュリティを検査するためのツールです。

Nmap - Free Security Scanner For Network Exploration & Security Audits.
http://nmap.org/

各ポートにアクセスして、公開されているポートを調べたり、 その脆弱性を確認したりする「ポートスキャン」 を行うオープンソースソフトウェアとして、比較的昔から有名です。

ありがたいことに、大抵のディストリビューションにはパッケージが用意されています。 いつもの手順でインストールしましょう。

  # yum install nmap           (RedHat系の場合)
  $ sudo apt-get install nmap  (Debian系の場合)

Nmap を(十分に気をつけてから)使ってみましょう

では早速使いたいと思いますが、その前に、注意すべきことがあります。

そのため、対象のマシンや途中のルータなどで、ログに記録したり、 不正アクセスと判断されて通知されたりなど、 法に触れる行為を行ったと判断されるかもしれません。

ですので、どのようなアクセスをしても許される環境、 あるいは自分自身ですべて対処できる(隠蔽できる?)ところで、お試しください。

 

さて、今回使用するのは、パッケージと同名の「nmap」コマンドです。

引数にホスト名またはIPアドレスを指定して実行すると、 TCPの各ポートのスキャン結果を出力します。

  $ nmap 192.168.1.1

  Starting Nmap 6.40 ( http://nmap.org ) at 2014-04-20 23:10 JST
  Nmap scan report for 192.168.1.1
  Host is up (0.022s latency).
  Not shown: 996 closed ports
  PORT     STATE    SERVICE
  23/tcp   filtered telnet
  25/tcp   filtered smtp
  53/tcp   open     domain
  80/tcp   open     http

  Nmap done: 1 IP address (1 host up) scanned in 1.38 seconds

上記の場合、53/tcp と 80/tcp が接続可能(開いている=open)な状態で、 23/tcp と 25/tcp が不明(フィルタにより制限がかかっている=filtered) な状態であることがわかります。

UDPに対してスキャンを行うには、「-sU」オプションを指定します。
ただし、root の権限が必要です。su コマンドなどで root になってから実行するか、 sudo コマンド経由で実行してください。

  # nmap -sU 192.168.1.1
  ...中略...
  PORT     STATE         SERVICE
  68/udp   open|filtered dhcpc
  69/udp   open|filtered tftp
  123/udp  open          ntp
  137/udp  open          netbios-ns
  161/udp  open          snmp
  514/udp  open|filtered syslog
  5353/udp open|filtered zeroconf
  ...後略...

「-v」オプションを付けて実行すると、詳細情報を出力します。

  $ nmap -v 192.168.1.1
  ...中略...
  Initiating Ping Scan at 23:31
  Scanning 192.168.1.1 [2 ports]
  Completed Ping Scan at 23:31, 0.09s elapsed (1 total hosts)
  Initiating Connect Scan at 23:31
  Scanning 192.168.1.1 [1000 ports]
  Discovered open port 53/tcp on 192.168.1.1
  Discovered open port 80/tcp on 192.168.1.1
  ...中略...
  Completed Connect Scan at 23:31, 1.53s elapsed (1000 total ports)
  Nmap scan report for 192.168.1.1
  Host is up (0.033s latency).
  ...後略...

また、「-p」オプションで、スキャン対象のポートを指定できます。
たとえば、21〜23/tcp だけを調査したいときは、以下のように指定して実行します。

  $ nmap -p 21-23 192.168.1.1
  ...中略...
  PORT   STATE  SERVICE
  21/tcp open   ftp
  22/tcp closed ssh
  23/tcp closed telnet
  ...後略...

「,」で区切って複数を指定することもできます。

  $ nmap -p 21-23,25,53,110 192.168.1.1

ちなみに、相手が ping に答えない(ICMP Echo Reply を返さない)と、

  Note: Host seems down. If it is really up, but blocking our ping probes, try -Pn

と言われて、スキャンに失敗してしまいます。
上記のアドバイスの通り、「-Pn」オプションを付けて実行すると、 ping によるチェックをすっ飛ばします。

OS の種類なども確認できます

TCPやUDPのポートの確認だけでなく、それらの結果からOSを推測することができます。 それには、「-O」オプションを指定します。
(root 権限が必要です。su するか sudo 経由で実行しましょう。)

  # nmap -O 192.168.1.1
  ...中略...
  Running: Linux 2.6.X
  OS CPE: cpe:/o:linux:linux_kernel:2.6
  OS details: Linux 2.6.9 - 2.6.19
  Network Distance: 1 hop
  ...後略...

  # nmap -Pn -O 192.168.1.2
  ...中略...
  Too many fingerprints match this host to give specific OS details
  ...後略...

後者のように、情報が少なすぎて推測できない場合もあります。

また、「-A」オプションを指定すると、サービスなどから得た情報も出力してくれます。

  # nmap -A 192.168.1.3
  ...中略...
  21/tcp   open  ftp           OpenBSD ftpd 6.4 (Linux port 0.17)
  ...中略...
  80/tcp   open  http          Apache httpd 2.4.6 ((Ubuntu))
  ...中略...
  139/tcp  open  netbios-ssn   Samba smbd 3.X (workgroup: FOO)
  222/tcp  open  ssh           (protocol 2.0)
  ...中略...
  Service Info: Host: foo; OSs: Unix, Linux; CPE: cpe:/o:linux:\
  linux_kernel
  ...後略...

うーん、このマシンは、自身の情報をいろいろ公開していますね…。

おわりに

以上、Nmap の簡単な使い方を紹介しました。

Nmap には、オプションがいっぱいあり、 それぞれどういう効用があるのか確認するだけでも、非常に勉強になると思います。 いずれにしても、 ご自身で責任のとれる範囲のマシンやネットワーク上でお試しくださいませ。

そして、お察しの通り、ネタに困った末、このような結果となりました。そのため、 ひねりがどこにも見当たりません。
次回は、もう少し早めに準備して、ひねってみたいと思います。

宿題の答えと補足

前回の宿題は、

  クラスBのサブネットで稼働中のマシンを知るためのシェルスクリプト
  を作ってみましょう。

でした。

まず、宿題に入る前に、いただいた助言を紹介します。
集約すると、以下の2つでした。

  • pingの「-b」オプションでブロードキャストしたら?
  • pingをバックグラウンドで動かしてみたら?

前者は、返事を返してくれるOSがいらっしゃらないようです。
ひと昔前に問題となった「Smurf攻撃」への対処のためと思われます。

Smurf攻撃とは : IT用語辞典
http://e-words.jp/w/SmurfE694BBE69283.html

たとえば Linux の場合、デフォルトで無視する設定になっています。

  $ sysctl net.ipv4.icmp_echo_ignore_broadcasts
  net.ipv4.icmp_echo_ignore_broadcasts = 1

後者は、まったくその通りで、衝撃と感銘を受けました。
早速、以下のスクリプトで試してみました。

#!/bin/sh
BASEADDR="192.168.1."
for n in $(seq 1 254); do
    IPADDR="${BASEADDR}${n}"
    ping -c 1 -W 1 $IPADDR > /dev/null &
done
sleep 5
LANG=C arp -an | sed -n \
    "s/^.*(\($BASEADDR.*\)) at \([0-9a-f]*.*\) \[.*$/\1 : \2/p" | sort

BASEADDR でクラスCのアドレス(最初の3つ)を指定して、 1〜254 に対して一斉に ping を実行しています。
そして、5秒待った後、arp コマンドを実行して、 不明でない結果だけを出力しています。

つまり、前回紹介したスクリプトでは数分かかっていましたが、 上記では10秒かかりません。

ping を254個同時に動かして問題ないの? とか、 5秒より長く待ったほうがいいかもなど、調整は必要かもしれません。ただ、 こちらのゆるい環境では、概ね問題なく動作しています。

 

では、宿題に立ち戻りまして、その クラスB 版を作ってみましょう。
…というわけで、作りました。以下の通りです。

#!/bin/sh
TMPFILE=$(mktemp /tmp/searchhost-XXXXXX)
trap "rm -f $TMPFILE" $(seq 0 15)
BASEADDR="172.16."
for n in $(seq 0 255); do
    NADDR="${BASEADDR}${n}."
    for m in $(seq 0 255); do
	t=$(expr $m + $n)
	if [ $t -gt 0 -a $t -lt 510 ]; then
	    ping -c 1 -W 1 ${NADDR}${m} > /dev/null &
	fi
    done
    sleep 5
    echo "${NADDR} done."
    LANG=C arp -an | sed -n \
    	"s/^.*(\(${NADDR}.*\)) at \([0-9a-f]*.*\) \[.*$/\1 : \2/p" \
	>> $TMPFILE
done
sort $TMPFILE | uniq

二重ループになっているのと、 内側のループが終わる度に途中経過を記録している点が違うほかは、 だいたい同じです。

これを、いつものように、 たとえば searchhostB.sh というファイル名で保存したら、 実行権を付けて実行してみましょう。

  $ chmod +x searchhostB.sh
  $ date; ./searchhostB.sh ; date
  2014年  4月 20日 日曜日 16:27:03 JST
  172.16.0. done.
  172.16.1. done.
  ...中略...
  172.16.255. done.
  172.16.1.1 : 00:01:02:03:04:05
  172.16.1.254 : 00:02:04:06:08:0a
  172.16.2.123 : 00:10:20:30:40:50
  172.16.2.2 : 00:11:22:33:44:55
  ...中略...
  2014年  4月 20日 日曜日 16:52:20 JST

ちなみに、date コマンドで挟んで実行しているのは、 大まかな実行時間を確認するためです。なくて構いません。

ただ、マシンによっては、以下のメッセージが大量に出力されてしまい、 うまく動きませんでした。

  connect: 利用可能な空きバッファがありません
  (あるいは、connect: No buffer space available)

sysctl で下記のパラメータを大きくすると緩和されましたが、 それでもぽつぽつと出力され、完全に解消されることはありませんでした。

  net.core.somaxconn
  net.ipv4.neigh.default.gc_thresh1
  net.ipv4.neigh.default.gc_thresh2
  net.ipv4.neigh.default.gc_thresh3

もし上記エラーメッセージが大量に出力され、 スクリプトを終了させられなくなってしまったら、[Ctrl]+[Z] を押して停止し、 kill -9 %1 で強制終了してください。

原因は、単なるメモリ不足なのかもしれませんが、調べられていません。
そ、そのうち調べておきます。(た、たぶん…き、きっと…。)

今回の宿題

今回の宿題は、

  Nmapでスキャンされるポートのデフォルトが何か、調べてみましょう。

です。

メッセージを見る限り、1000個のポートをスキャンしているようですが、 その内訳を知っておくべきではと思い、宿題とさせていただきました。

ドキュメントか設定ファイルを探せば、最悪ソースコードを見れば、 答えがわかるだろうと思っています。(つまり、答えを知りません…。)

あとがき

前回発行後の4月9日に、Windows XPのサポート期間が終了しました。

わたしの周りでは驚くほど話題になっていないのですが、よく考えたら、 わたしの知り合いには、Windows XPをメインで使っている人も、 Windowsな管理者の方も、いませんでした。

それはさておき、Windows XPの代替として Linux はどうか? 的な記事をしばしば見かけます。結構難しいと思うのですが、 どうなんでしょうか?
…と思って、いくつかかき集めてみました。

Linux未経験者が職場で使うLinux、どれがおすすめ?
http://linux.slashdot.jp/story/14/04/12/0752258/

サポート終了のWindows XPからUbuntuへ移行することが必ずしもおススメできない理由【デジ通】
http://news.livedoor.com/article/detail/8607836/

Windows XP サポートは明日(4月9日)終了 - これは、Linux にとって絶好のチャンスだ
http://internetcom.jp/webtech/20140408/1.html

XPサポート終了でLinuxは普及するのか
http://itpro.nikkeibp.co.jp/article/Watcher/20130805/496709/

XPサポ切れ対策待ったなし、個人PCならぜひ脱Windowsを
http://itpro.nikkeibp.co.jp/article/Watcher/20140205/534744/

Linuxで解決! と安易に勧めている記事は、ひとつもありませんでした。
一部で批判されているっぽい、日経Linuxの記事も、ヤミクモではなく、 ちゃんと条件付きで書かれています。

また、コメント欄は、概ね懐疑的な感じです。
興味深かったのは、使用面だけでなく、 サポートも含めたコストのことに触れられていて、Windows は決して高くない、 という意見が多かったことです。ひと昔前の、無料が正義、 みたいな盲目的な意見ではなく、 比較的公平・冷静に見ている人が多いように感じました。

ただ、裏を返せば、Linux の利点が明確で、説得力がそれなりに含まれていないと、 Linux を選択肢に加えてもらうことすら叶わないかも、ということでもあります。

時代の流れに逆らうのはよくありませんが、 自分がよいと思っていることやものがあれば、殻に閉じこもらず、 能動的かつ積極的に伝えていくことが必要なのかもしれません。

 

というわけで、突貫工事的にメルマガを書いてちゃいけない、 ということを、肝に銘じたいと思います…。

 

今回も、ここまで読んでいただき、誠にありがとうございました。
次回は、黄金週間の 5月5日(日) 未明にお会いしましょう!

 

「いますぐ実践! Linux システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」- またアクセスが増えているような。いないような。
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
http://usupi.org/k/ (モバイル栗日記)
http://twitter.com/kuriking/ (栗つぶやき)
http://facebook.com/kuriking3 (栗顔本)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本