はじめに
この実験では、シェルスクリプトと cron スケジューリングを使って Nmap スキャンを自動化する方法を学びます。この実験では、まず、192.168.1.1 を対象とした Nmap SYN スキャンコマンドを含む単純なシェルスクリプト scan.sh を作成します。次に、chmod +x scan.sh を使ってスクリプトを実行可能にし、ターミナルから実行します。
この実験は、テキストエディタを使ってスクリプトを拡張して複数のスキャンを含めることで続けられます。最後に、cron を使ってスクリプトを自動的に実行するようにスケジュールを設定し、crontab -e で設定し、Xfce ターミナルで自動実行を確認します。
echo "nmap -sS 192.168.1.1" > scan.sh を使ってスキャンスクリプトを作成する
このステップでは、Nmap スキャンを実行する単純なシェルスクリプトを作成します。このスクリプトは、後でより複雑なスキャンを自動化するための基礎となります。echo コマンドを使って、Nmap コマンドを scan.sh という名前のファイルに書き込みます。
まず、echo が何をするかを理解しましょう。echo コマンドは、その引数を標準出力に単に表示します。この出力を > 演算子を使ってファイルにリダイレクトすることができます。
使う Nmap コマンドは nmap -sS 192.168.1.1 です。分解してみましょう:
nmap:これは Nmap スキャナを実行するコマンドです。-sS:このオプションは SYN スキャンを指定します。これは、ポートをスキャンする隠密な方法です。TCP ハンドシェイクを完了しないため、「半開」スキャンとも呼ばれます。192.168.1.1:これはスキャンしたい対象の IP アドレスです。これは一般的なプライベート IP アドレスですが、ネットワーク構成に応じて調整する必要がある場合があります。
では、スクリプトを作成しましょう。~/project ディレクトリでターミナルを開き(まだそこにいない場合は)、次のコマンドを実行します:
echo "nmap -sS 192.168.1.1" > scan.sh
このコマンドは、~/project ディレクトリに scan.sh という名前のファイルを作成し、その中に Nmap コマンドを書き込みます。
ファイルが正しく作成されたことを確認するには、cat コマンドを使ってその内容を表示できます:
cat scan.sh
次の出力が表示されるはずです:
nmap -sS 192.168.1.1
これで、正しい Nmap コマンドでスクリプトが作成されたことが確認できます。
chmod +x scan.sh を使ってスクリプトを実行可能にする
このステップでは、scan.sh スクリプトを実行可能にします。Linux では、新しく作成されたファイルはデフォルトで実行権限を持っていません。この権限を明示的に付与する必要があり、スクリプトを実行できるようにするためです。
chmod コマンドは、ファイルやディレクトリの権限を変更するために使用されます。+x オプションは、指定されたファイルに実行権限を追加します。
ターミナルで ~/project ディレクトリに移動し(まだそこにいない場合は)、次のコマンドを実行します:
chmod +x scan.sh
このコマンドは、scan.sh ファイルに実行権限を追加します。
スクリプトが現在実行可能であることを確認するには、ls -l コマンドを使ってファイルの権限を一覧表示できます。
ls -l scan.sh
次のような出力が表示されるはずです:
-rwxr-xr-x 1 labex labex 25 Oct 26 10:00 scan.sh
-rwxr-xr-x 文字列の x は、ファイルが現在実行可能であることを示しています。具体的には、最初の rwx は所有者の権限(読み取り、書き込み、実行)を表し、2 番目の r-x はグループの権限を表し、3 番目の r-x は他者の権限を表します。
これでスクリプトが実行可能になったので、次のステップで実行できます。
./scan.sh でスクリプトを実行する
このステップでは、前のステップで作成して実行可能にした scan.sh スクリプトを実行します。
スクリプトを実行するには、./ 接頭辞を使用します。これは、シェルに対して、現在のディレクトリにあるスクリプトを実行するように指示します。
ターミナルで、~/project ディレクトリにいることを確認して、次のコマンドを実行します:
./scan.sh
ターミナルに Nmap の出力が表示されるはずです。出力は、対象ホスト (192.168.1.1) に到達できるかどうか、およびその上で実行されているサービスによって異なります。対象が到達できない場合、「Host seems down.」のようなメッセージが表示されるかもしれません。対象が到達できる場合、開いているポートの一覧や対象に関するその他の情報が表示されます。
重要な注意事項:192.168.1.1 の IP アドレスは、一般的なデフォルトゲートウェイアドレスです。これがネットワーク上のデバイスの正しいアドレスでない場合、スキャンは有用な結果を得られないかもしれません。192.168.1.1 を、スキャンしたいネットワーク上のデバイスの IP アドレスに置き換えることができます。ただし、対象をスキャンする許可を持っていることを確認してください。許可なくネットワークをスキャンすることは、違法で倫理的ではありません。
nmap の出力は、ネットワークや対象によって大きく異なるため、直接出力を確認することはできません。ただし、コマンド履歴を確認することで、コマンドが実行されたことを確認することができます。
Xfce のテキストエディタでスクリプトに複数のスキャンを追加する
このステップでは、Xfce テキストエディタを使って scan.sh スクリプトにさらに多くの Nmap スキャンコマンドを追加します。これにより、1 回のスクリプト実行で複数のスキャンを行うことができます。
まず、Xfce テキストエディタで scan.sh ファイルを開きます。デスクトップを右クリックして「ここでターミナルを開く」を選択し、次のコマンドを入力することで行えます:
nano scan.sh
これにより、nano テキストエディタで scan.sh ファイルが開きます。
現在、スクリプトには 1 行だけ含まれています:
nmap -sS 192.168.1.1
さらに 1 つのスキャンコマンドを追加しましょう。たとえば、別のホストが稼働しているかどうかを確認するためのピングスキャン (-sn) を追加できます:
nmap -sS 192.168.1.1
nmap -sn 192.168.1.2
好きなだけ多くのスキャンコマンドを追加できます。たとえば、最初の対象にバージョン検出スキャン (-sV) を追加しましょう:
nmap -sS -sV 192.168.1.1
nmap -sn 192.168.1.2
これで、スクリプトはまず 192.168.1.1 に対してバージョン検出付きの SYN スキャンを行い、その後 192.168.1.2 に対してピングスキャンを行います。
重要な注意事項:192.168.1.1 と 192.168.1.2 を、スキャンしたいネットワーク上のデバイスの IP アドレスに置き換え、それらをスキャンする許可があることを確認してください。
変更を保存するには、Ctrl+X を押してから、保存を確認するために Y を押し、その後 Enter を押してファイルを保存します。
これで、./scan.sh を使ってスクリプトを実行すると、追加したすべての Nmap コマンドが実行されます。
cron を使って crontab -e でスキャンをスケジュールする
このステップでは、cron を使って scan.sh スクリプトを自動的に実行するようにスケジュール設定します。cron は、Linux 互換のオペレーティングシステムにおける時間ベースのジョブスケジューラです。これにより、特定の時刻、日付、または間隔でコマンドやスクリプトを実行するようにスケジュール設定できます。
cron でタスクをスケジュール設定するには、crontab コマンドを使用します。crontab -e コマンドは、テキストエディタ(通常は LabEx 環境では nano)で crontab ファイルを開きます。
ターミナルで、次のコマンドを入力します:
crontab -e
こが初めて crontab を使用する場合、エディタを選択するように促されるかもしれません。対応する番号を選択して nano を選びます。
crontab ファイルには、それぞれ別の行に cron ジョブの一覧が含まれています。各行は 6 つのフィールドで構成されています:
分 時 月の日 月 曜日 コマンド
- 分:ジョブが実行される時の時の分(0 - 59)。
- 時:ジョブが実行される日の時(0 - 23)。
- 月の日:ジョブが実行される月の日(1 - 31)。
- 月:ジョブが実行される年の月(1 - 12)。
- 曜日:ジョブが実行される曜日(0 - 6、0 は日曜日)。
- コマンド:実行するコマンド。
たとえば、scan.sh スクリプトを毎分実行するには、crontab ファイルに次の行を追加します:
* * * * * /home/labex/project/scan.sh
この行は次の意味を持ちます:
*:毎分*:毎時*:月の毎日*:毎月*:曜日の毎日/home/labex/project/scan.sh:実行するコマンド(スクリプトの完全パス)
重要:実際のシナリオでは、毎分スキャンを実行するのは一般的に良い考えではありません。なぜなら、ネットワークや対象デバイスに負荷をかける可能性があるからです。この実験ではテスト目的のため、毎分実行することは許容されます。
変更を保存するには、Ctrl+X を押してから、保存を確認するために Y を押し、その後 Enter を押してファイルを保存します。
「crontab: installing new crontab」のようなメッセージが表示されるはずです。これは、cron ジョブが正常にスケジュール設定されたことを意味します。
Cron ジョブは通常、バックグラウンドで実行され、出力は表示されません。scan.sh スクリプトの出力を見るには、それをファイルにリダイレクトできます。たとえば、~/project ディレクトリにある scan.log という名前のファイルに出力をリダイレクトするには、cron ジョブのエントリを次のように変更できます:
* * * * * /home/labex/project/scan.sh > /home/labex/project/scan.log 2>&1
> /home/labex/project/scan.log の部分は、標準出力を scan.log ファイルにリダイレクトし、2>&1 は標準エラーを同じファイルにリダイレクトします。
Xfce ターミナルでの自動化を確認する
このステップでは、scan.sh スクリプトが cron によって自動的に実行されていることを確認します。スクリプトを毎分実行するようにスケジュール設定したので、その実行の証拠が見られるはずです。
もしスクリプトの出力をファイル(例えば scan.log)にリダイレクトしている場合、そのファイルの内容を確認してスクリプトが実行されているかどうかを確認できます。ターミナルで、次のコマンドを入力します:
tail /home/labex/project/scan.log
このコマンドは、scan.log ファイルの最後の数行を表示します。スクリプトが正しく実行されている場合、ファイルには Nmap スキャンの出力が毎分更新されて表示されるはずです。
もし出力をファイルにリダイレクトしていない場合、scan.log ファイルはありません。この場合、今作成して cron ジョブの出力をそれにリダイレクトすることができます。もう一度 crontab を編集します:
crontab -e
そして cron ジョブのエントリを次のように変更します:
* * * * * /home/labex/project/scan.sh > /home/labex/project/scan.log 2>&1
crontab ファイルを保存します。その後、1,2 分待って tail /home/labex/project/scan.log を使って再度 scan.log ファイルを確認します。
まだ何も出力が見られない場合、スクリプトまたは cron ジョブに問題があるかもしれません。以下を再度確認してください:
scan.shスクリプトが実行可能であることを確認してください(chmod +x scan.sh)。- crontab ファイルの cron ジョブのエントリが正しいことを確認してください(cron ジョブを一覧表示するには
crontab -l)。 - cron ジョブのエントリにスクリプトの完全パスが使用されていることを確認してください(
/home/labex/project/scan.sh)。 - スクリプト自体のエラーを確認してください。
重要:cron ジョブは毎分実行されるため、scan.log ファイルは急速に増大します。正常に動作していることを確認した後は、ディスク空間が一杯にならないように cron ジョブを削除することが望ましい場合があります。crontab ファイルを編集して(crontab -e)追加した行を削除することで、cron ジョブを削除できます。
まとめ
この実験では、シェルスクリプトと cron を使って Nmap スキャンを自動化する方法を学びました。まず、特定の IP アドレスを対象とした Nmap SYN スキャンコマンドを含む scan.sh という簡単なシェルスクリプトを作成しました。その後、chmod +x scan.sh を使ってスクリプトを実行可能にし、ターミナルから直接実行できるようにしました。
次に、テキストエディタを使ってスクリプトを拡張して複数のスキャンを含めました。最後に、cron を使ってスクリプトを自動的に実行するようにスケジュール設定し、crontab -e を使って cron ジョブを設定し、Xfce ターミナルで自動化を確認しました。これにより、定期的な監視やセキュリティ評価のためのネットワークスキャンタスクを自動化する方法が示されました。



