📕

Linuxの基礎 - Cyber Security Roadmap

2024/12/11に公開

サイバーセキュリティイメージ

サイバーセキュリティとLinux

Linuxは、サイバーセキュリティにおいて便利なOSです。オープンソースで自由にカスタマイズ可能であり、高い安定性と信頼性を備えています。そして多くのセキュリティツールや機能を備えています。多くのハッカーがLinuxを活用する背景には、システムの深いレベルまで操作可能であることや、攻撃と防御の両面に役立つツールが豊富であることが挙げられます。

例えば、Kali LinuxやParrot OSなどのセキュリティ特化型ディストリビューションは、脆弱性スキャンやネットワーク解析、ペネトレーションテストを効率的に行えるツールがあらかじめインストールされています。これらを活用することで、攻撃者視点でのシステム分析や防御策の検証が容易になります。

その様な背景から、サイバーセキュリティを学ぶうえで、Linuxの基本的な知識は必須です。ファイル操作やプロセス管理、ユーザー管理を習得することで、攻撃の予防や迅速な対処が可能になります。また、シェルスクリプトを用いた自動化やログ分析のスキルは、セキュリティ運用の効率を大幅に向上させます。

Linuxとは?

Linux

Linuxは、コンピュータを動かすための基本ソフトウェアであるOS(オペレーティングシステム) の一種です。1991年、リーナス・トーバルズ(Linus Torvalds)氏によって開発され、オープンソースとして公開されました。もともとはサーバー向けに設計されましたが、現在ではデスクトップPC、スマートフォン、組み込み機器など、多岐にわたる用途で利用されています。

特徴

  • 高品質で自由にカスタマイズ可能なソフトウェアが豊富。
  • ハッカーやセキュリティ専門家に広く愛用されている。
  • セキュリティテストやペネトレーションテスト向けに特化したディストリビューション(OSの中核となるソフトウェアに、色々なソフトウェアを組み合わせて使いやすくしたもの。OSのパッケージ)も存在する。

演習用環境

以下に一部の解説で使用する、ソースコードを公開しているのでよかったらどうぞ!
空いた時間に随時更新し、より実習しやすいよう改善する予定です。
ここでは、Dockerを使用し、Linuxを動かしていきます。手順はREADME.mdを参照してください。
https://github.com/sanflat/csr-code

.
└── csr-code/
    └── linux_basic/
        ├── Dockerfile
        └── README.md

Linuxファイルシステムの階層構造

ファイルシステム

Linuxのファイルシステム(コンピュータがファイルを管理する仕組み)は、ツリー構造(階層型ディレクトリ構造)になっています。すべてのファイルやディレクトリは、「/」(ルートディレクトリ)を基点に配置されています。

  • /home:各ユーザーのホームディレクトリが配置されています。たとえば、ユーザー「kano」のホームディレクトリは/home/kanoです。
  • /etc:システム設定ファイルが格納されています。
  • /var:ログファイルや一時データが保存されます。
  • /bin:基本的なコマンド(例:lscatなど)が配置されています。
  • /tmp:一時的なファイルを保存する場所です。

この構造はOSによって異なることがあります。例えばWindowsではドライブレターという概念があり、ストレージデバイスに「C:」「D:」といった英字のラベルがありますが。ストレージデバイス(ディスク)2つあると2つのツリー構造を作ります。使用するOSの構造を理解することで、ファイルや設定がどこにあるのかを効率的に把握できるようになります。

ツリー

基本的なLinuxコマンド

シェルコマンド

Linuxを操作する際、シェルと呼ばれるコマンドラインインターフェース(CLI)が主に使用されます。以下は基本的なコマンドの一部です

テキストの出力

  • echo:指定したテキストや変数の内容を出力します。
    • echo Hello, World! → 「Hello, World!」と表示します。
root@7fed400f5084:/workspace# echo Hello, Wrold!
Hello, Wrold!

ログインユーザー名の表示

  • whoami:現在ログインしているユーザー名を表示します。
    • whoami → 現在のユーザー名(例:root)を表示します。
root@088b2173edfc:/workspace# whoami
root

ディレクトリ操作

  • pwd:print name of working directoryの略です。現在の作業ディレクトリを表示します。
    • 例:pwd
root@088b2173edfc:/workspace/notes# pwd
/workspace/notes
  • ls:listの略です。ディレクトリ内のファイルやフォルダを一覧表示します。
    • 例:ls -l(詳細情報を表示)、ls -a(隠しファイルを表示)
root@088b2173edfc:/workspace/notes# ls
20990101_note.txt  20990102_note.txt
root@088b2173edfc:/workspace/notes# ls -l
total 8
-rw-r--r-- 1 1000 1000 467 Dec 14 01:30 20990101_note.txt
-rw-r--r-- 1 root root 475 Dec 14 03:01 20990102_note.txt
root@088b2173edfc:/workspace/notes# ls -a
.  ..  .secret.txt  20990101_note.txt  20990102_note.txt
  • cd:change directoryの略です。ディレクトリを移動します。
    • 例:`cd /workspace/notes/
root@088b2173edfc:/# cd /workspace/notes/
root@088b2173edfc:/workspace/notes#

cdコマンドの特別なディレクトリ指定

cdコマンドはよく使うコマンドの一つなため、特別なディレクトリ指定を覚えておくと効率的に操作できる様になります。

指定 意味 コマンド例
. カレントディレクトリ(現在のディレクトリ) cd .(移動なし)
.. 親ディレクトリ(1階層上のディレクトリ) cd ..(1階層上に移動)
~ ホームディレクトリ(ログインユーザーの初期位置) cd ~(ホームに移動)
/ ルートディレクトリ(ファイルシステムの最上位) cd /(ルートに移動)

補足

  • カレントディレクトリ(.
    現在のディレクトリを明示的に指定したい場合に使用。通常、cd .を使うことはありませんが、スクリプトなどで便利な場合があります。

  • 親ディレクトリ(..
    現在のディレクトリから1階層上に移動する際に使用。連続して使うことで、複数階層を一気に上がることも可能(例:cd ../..)。

  • ホームディレクトリ(~
    各ユーザーごとに割り当てられたデフォルトのディレクトリを指します。他のユーザーのホームディレクトリに移動する際は~[ユーザー名]と指定(例:cd ~bob)。

  • ルートディレクトリ(/
    ファイルシステムの最上位を指します。システム全体のディレクトリ構造がここから始まります。

root@088b2173edfc:/# cd /workspace/notes/
root@088b2173edfc:/workspace/notes# cd .
root@088b2173edfc:/workspace/notes# cd ../
root@088b2173edfc:/workspace# cd notes/../../
root@088b2173edfc:/# cd ~
root@088b2173edfc:~# cd /
root@088b2173edfc:/#

ファイル操作

  • cat:concatenateの略です。ファイルの内容を表示します。
    • 例:cat file.txt
root@088b2173edfc:/workspace/notes# cat 20990101_note.txt
"The Sacred Land of Socks"

Today, while folding laundry, yet again, one sock mysteriously disappeared. Every time, I find myself wondering, "Where did it go?" There must be a secret meeting place for socks inside the washing machine. I secretly look forward to the day when future archaeologists declare, "This was the sacred land of socks." But for now, I’ve given up and decided to create a new mismatched pair.
  • mkdir:make directoryの略です。新しいディレクトリを作成します。
    • 例:mkdir new_folder
root@2a26a716cd14:/workspace/linux_basic# ls
document  log  notes
root@2a26a716cd14:/workspace/linux_basic# mkdir new_folder
root@2a26a716cd14:/workspace/linux_basic# ls
document  log  new_folder  notes
  • touch:空のファイルを作成します。
    • 例:touch newfile.txt
root@2a26a716cd14:/workspace/linux_basic/new_folder# ls
root@2a26a716cd14:/workspace/linux_basic/new_folder# touch newfile.txt
root@2a26a716cd14:/workspace/linux_basic/new_folder# ls
newfile.txt
  • cp:ファイルやディレクトリをコピーします。
    • cp newfile.txt copyfile.txtnewfile.txtcopyfile.txtとしてコピーします。
root@2a26a716cd14:/workspace/linux_basic/new_folder# ls
newfile.txt
root@2a26a716cd14:/workspace/linux_basic/new_folder# cp newfile.txt copyfile.txt
root@2a26a716cd14:/workspace/linux_basic/new_folder# ls
copyfile.txt  newfile.txt
  • mv:ファイルやディレクトリを移動または名前を変更します。
    • mv file1.txt file2.txtfile1.txtfile2.txtに名前を変更します。
root@2a26a716cd14:/workspace/linux_basic# mkdir copy_folder
root@2a26a716cd14:/workspace/linux_basic# ls
copy_folder  document  log  new_folder	notes
root@2a26a716cd14:/workspace/linux_basic# mv ./new_folder/copyfile.txt ./copy_folder/
root@2a26a716cd14:/workspace/linux_basic# ls ./copy_folder/
copyfile.txt
  • rm:removeの略です。ファイルやディレクトリを削除します。
    • 例:rm copyfile.txt(ファイル削除)、rm -r copy_folder(ディレクトリ削除)
root@2a26a716cd14:/workspace/linux_basic/copy_folder# ls
copyfile.txt
root@2a26a716cd14:/workspace/linux_basic/copy_folder# rm copyfile.txt
root@2a26a716cd14:/workspace/linux_basic/copy_folder# ls
root@2a26a716cd14:/workspace/linux_basic/copy_folder#
...
root@2a26a716cd14:/workspace/linux_basic# ls
copy_folder  document  log  new_folder	notes
root@2a26a716cd14:/workspace/linux_basic# rm -r copy_folder/
root@2a26a716cd14:/workspace/linux_basic# ls
document  log  new_folder  notes
  • file:指定したファイルの種類を表示します。
    • file newfile.txtnewfile.txtがテキストファイルであることを表示します。
root@058f3080dafe:/workspace/new_folder# ls
newfile.txt
root@058f3080dafe:/workspace/new_folder# file newfile.txt
newfile.txt: empty
root@058f3080dafe:/workspace/new_folder# echo "Hello, World!" > newfile.txt
root@058f3080dafe:/workspace/new_folder# file newfile.txt
newfile.txt: ASCII text

ファイル操作とプロセス管理

もう一歩踏み込んだLinuxの基本操作として、ファイル検索プロセス管理について学びます。これらはシステム運用やトラブルシューティング(トラブルの原因を探して取り除くこと)に欠かせないスキルです。ぜひ実際にLinuxを操作しながら、コマンドの使い方を習得してみてください。

ファイル検索の基本

Linuxでは、システム内のファイルやディレクトリを効率的に検索するために、いくつかの便利なコマンドが用意されています。

1. findコマンド

**find**コマンドは、指定した条件に基づいてファイルやディレクトリを検索できる強力なツールです。

  • 基本構文
    find [検索開始ディレクトリ] [条件]
    
    • 名前で検索
      find /home -name "file.txt"
      
    • 特定の拡張子で検索
      find /home -name "*.txt"
      
      root@058f3080dafe:/workspace# find -name sample.log
      ./log/sample.log
      
      root@058f3080dafe:/workspace# find -name *.txt
      ./new_folder/newfile.txt
      ./document/passwords.txt
      ./notes/20990102_note.txt
      ./notes/.secret.txt
      ./notes/20990101_note.txt
      

2. locateコマンド

locate コマンドは、ファイルやディレクトリを非常に高速に検索できるツールです。

なぜfindより速いのか?

locateはリアルタイムでファイルシステムを探すのではなく、事前に作成されたファイル情報のデータベースを参照します。このデータベースにはシステム全体のファイル情報が保存されており、それを利用することで高速な検索が可能になります。

基本構文と使用例

  • 基本構文
    locate [検索キーワード]
    
  • 使用例
    locate sample.log
    
root@058f3080dafe:/workspace# updatedb
root@058f3080dafe:/workspace# locate sample.log
/workspace/log/sample.log

注意:データベースの更新が必要

locateの検索結果は、データベースに基づいているため、新しいファイルや削除されたファイルは、データベースを更新しない限り反映されません。正確な検索結果を得るためには、以下のコマンドで定期的にデータベースを更新してください。

sudo updatedb

これにより、最新のファイル情報が検索可能になります。

テキスト検索の基本

Linuxでは、ファイル内の特定の文字列を検索する際に便利なコマンドがいくつか用意されています。その中でも、**grep**は非常に強力で使いやすいツールです。

1. grepコマンド

**grep**コマンドは、ファイルやテキスト内から指定した文字列を検索して表示するツールです。検索結果を絞り込むためのオプションも豊富に用意されています。

  • 基本構文

    grep [オプション] "検索文字列" [ファイル名]
    
    • 特定の文字列を含む行を検索

      root@058f3080dafe:/workspace# grep "ERROR" ./log/sample.log
      2024-12-14 10:05:42 ERROR: Failed to connect to database
      2024-12-14 10:20:11 ERROR: Unable to resolve DNS for example.com
      2024-12-14 10:45:09 ERROR: Invalid user credentials
      

      上記の例では、サンプルログファイルから「ERROR」を含む行を表示します。

    • 大文字と小文字を区別せずに検索

      root@d2b74d231897:/workspace# grep -i "error" ./log/sample.log
      2024-12-14 10:05:42 ERROR: Failed to connect to database
      2024-12-14 10:20:11 ERROR: Unable to resolve DNS for example.com
      2024-12-14 10:45:09 ERROR: Invalid user credentials
      

      オプション-iを使うと、大文字・小文字を区別せずに検索します。

    • サブディレクトリを含むすべてのファイルを検索

      grep -r "password" /etc
      

      オプション-rを使うと、指定したディレクトリ以下のすべてのファイルを再帰的に検索します。

    • 行番号を表示

      root@058f3080dafe:/workspace# grep -n "ERROR" ./log/sample.log
      3:2024-12-14 10:05:42 ERROR: Failed to connect to database
      6:2024-12-14 10:20:11 ERROR: Unable to resolve DNS for example.com
      11:2024-12-14 10:45:09 ERROR: Invalid user credentials
      

      オプション-nを使うと、検索結果の行番号を表示します。

    • 検索結果を除外

      root@058f3080dafe:/workspace# grep -v "DEBUG" ./log/sample.log
      2024-12-14 10:00:01 INFO: System startup complete
      2024-12-14 10:01:15 WARNING: Disk space running low on /dev/sda1
      2024-12-14 10:05:42 ERROR: Failed to connect to database
      2024-12-14 10:10:23 INFO: User logged in successfully
      2024-12-14 10:20:11 ERROR: Unable to resolve DNS for example.com
      2024-12-14 10:25:45 INFO: Backup completed successfully
      2024-12-14 10:30:00 WARNING: High memory usage detected
      2024-12-14 10:35:22 INFO: Application update applied
      2024-12-14 10:45:09 ERROR: Invalid user credentials
      2024-12-14 10:50:01 INFO: System shutdown initiated
      

      オプション-vを使うと、指定した文字列を含まない行を表示します。

**grep**を使うと、ログ分析や設定ファイルの確認が非常に効率的になります。複数のオプションを組み合わせて使えば、さらに柔軟な検索が可能です。

記号や演算子の使用

パイプ

1つのコマンドの出力を次のコマンドの入力として渡すには、パイプ(|)を使用します。

使用例

cat | grep "ERROR"
root@55880b4e9ba4:/workspace/log# ls
sample.log
root@55880b4e9ba4:/workspace/log# cat sample.log | grep "ERROR"
2024-12-14 10:05:42 ERROR: Failed to connect to database
2024-12-14 10:20:11 ERROR: Unable to resolve DNS for example.com
2024-12-14 10:45:09 ERROR: Invalid user credentials

この例では、cat sample.logの結果をgrepに渡し、"ERROR"を含む行だけを表示します。

セミコロン

複数のコマンドを1行で順番に実行するには、セミコロン(;)を使用します。それぞれのコマンドは独立して実行されます。

使用例

mkdir test; cd test
root@55880b4e9ba4:/workspace/log# ls
sample.log
root@55880b4e9ba4:/workspace/log# mkdir newlog; cd newlog
root@55880b4e9ba4:/workspace/log/newlog# pwd
/workspace/log/newlog

この例では、まずnewlogディレクトリを作成し、その後にそのディレクトリに移動します。

論理OR

1つ目のコマンドが失敗した場合にのみ、次のコマンドを実行するには、論理OR(||)を使用します。

使用例

mkdir test || echo "Failed to create directory"
root@55880b4e9ba4:/workspace/log# ls
newlog	sample.log
root@55880b4e9ba4:/workspace/log# mkdir newlog || echo "Failed to create directory"
mkdir: cannot create directory 'newlog': File exists
Failed to create directory

この例では、mkdirが失敗した場合のみ「Failed to create directory」と表示します。

入力リダイレクター

ファイルの内容をコマンドに入力として渡すには、リダイレクター(<)を使用します。

使用例

cat < file.txt
root@55880b4e9ba4:/workspace/notes# cat < 20990101_note.txt
"The Sacred Land of Socks"

Today, while folding laundry, yet again, one sock mysteriously disappeared. Every time, I find myself wondering, "Where did it go?" There must be a secret meeting place for socks inside the washing machine. I secretly look forward to the day when future archaeologists declare, "This was the sacred land of socks." But for now, I’ve given up and decided to create a new mismatched pair.

この例では、20990101_note.txtの内容をcatに渡して表示します。

標準エラー出力のリダイレクト

エラーメッセージを別のファイルにリダイレクトするには、2>を使用します。

使用例

mkdir log 2> error.log
root@55880b4e9ba4:/workspace# ls
Dockerfile  README.md  document  log  notes
root@55880b4e9ba4:/workspace# mkdir log 2> error.log
root@55880b4e9ba4:/workspace# cat error.log
mkdir: cannot create directory 'log': File exists

この例では、エラーメッセージをerror.logに保存します。

標準エラー出力の追記リダイレクト

エラーメッセージを別のファイルに追記するには、2>>を使用します。

使用例

mkdir log 2>> error.log
root@55880b4e9ba4:/workspace# cat error.log
mkdir: cannot create directory 'log': File exists
root@55880b4e9ba4:/workspace# mkdir log 2>> error.log
root@55880b4e9ba4:/workspace# cat error.log
mkdir: cannot create directory 'log': File exists
mkdir: cannot create directory 'log': File exists

この例では、エラーメッセージをerror.logに追記します。

リモート操作

SSHプロトコルを使用してリモート接続する

SSH(Secure Shell)は、安全なネットワーク通信を確立し、リモートシステムにログインしたり、コマンドを実行したりするために使用されるプロトコルです。SSHは暗号化を採用しており、パスワードや通信内容が第三者に盗まれるリスクを軽減します。

構文

ssh [ユーザー名]@[ホスト名またはIPアドレス]
  • [ユーザー名]:リモートシステムのユーザー名。
  • [ホスト名またはIPアドレス]:接続先のリモートサーバーの名前やIPアドレス。

使用例

  1. リモートサーバーに接続:

    ssh kano@192.168.1.100
    

    この例では、IPアドレス192.168.1.100にあるサーバーに、ユーザーkanoとして接続します。

  2. カスタムポートで接続(デフォルトは22番):

    ssh -p 2222 kano@192.168.1.100
    

    ここでは、ポート番号2222を使用して接続します。

  3. 特定のコマンドをリモートで実行:

    ssh kano@192.168.1.100 "ls -l /home/kano"
    

    この例では、192.168.1.100に接続し、リモートサーバーでls -l /home/kanoを実行して結果を取得します。

SSHの特徴:

  • セキュリティ:SSHは通信内容を暗号化するため、ネットワーク経由で安全に操作が可能。
  • 柔軟性:ポート転送や鍵認証などの機能を提供し、さまざまな利用シナリオに対応。
  • 簡便性:コマンドラインからシンプルに操作でき、リモートサーバー管理に最適。

SSHを活用することで、リモートサーバーとの通信を効率的かつ安全に行うことが可能です。

Wgetを使用してWebサーバからコンテンツを取得する

  • wget:Webサーバからコンテンツをダウンロードするためのコマンドラインツールです。HTTP、HTTPS、FTPなどのプロトコルをサポートしています。

    • 例1:単一ファイルのダウンロード

      wget http://example.com/file.txt
      

      example.comfile.txtをカレントディレクトリにダウンロードします。

    • 例2:リモートWebページ全体を再帰的にダウンロード

      wget -r http://example.com
      

      example.comのすべてのリンク先ページを再帰的にダウンロードします。

    • 例3:ファイル名を指定して保存

      wget -O custom_name.txt http://example.com/file.txt
      

      file.txtcustom_name.txtとして保存します。

    • 例4:中断したダウンロードを再開

      wget -c http://example.com/largefile.zip
      

      → 中断したlargefile.zipのダウンロードを再開します。

Wgetの特徴:

  • 軽量で簡単:GUI不要で、シンプルなコマンドで操作可能。
  • 再帰的ダウンロード:リンクを辿ってWebサイト全体を取得できる。
  • 再開機能:大容量ファイルのダウンロードに便利な中断後の再開が可能。

Wgetは、Webサーバから効率的にコンテンツを取得するのに非常に便利なツールです。さまざまなオプションを組み合わせて、柔軟に活用することができます。

プロセス管理の基本

Linuxでは、実行中のプログラムやサービスは「プロセス」として扱われます。これらを監視・管理することで、システムの状態を把握し、パフォーマンスを最適化できます。

1. プロセスの確認

psコマンド

現在動作中のプロセスを確認する基本コマンドです。

  • 基本構文
    ps [オプション]
    
    • 標準的なプロセス一覧
      ps
      
    • すべてのプロセスを詳細表示
      ps aux
      

topコマンド

topは、リアルタイムでプロセス情報を監視できるコマンドです。CPU使用率やメモリ使用率が高いプロセスを簡単に特定できます。

  • 使用方法
    top
    

htopコマンド

htopは、topの視覚的な改良版です。使いやすいインターフェースで、プロセスの確認や終了が行えます。

2. プロセスの終了

killコマンド

プロセスID(PID)を指定して特定のプロセスを終了します。

  • 基本構文
    kill [PID]
    
  • kill 12345
    
killallコマンド

プロセス名を指定して、すべての該当プロセスを終了します。

  • 基本構文
    killall [プロセス名]
    
  • killall firefox
    

ジョブの管理

ジョブとは、LinuxやUnix系システムで実行中または実行予定のプロセスやタスクを指します。特に、シェルでバックグラウンドやフォアグラウンドで実行されるコマンドやスクリプトを管理する際に使われる用語です。

ジョブの種類

  1. フォアグラウンドジョブ

    • 現在ターミナル上で直接実行されているタスク。例えば、ユーザーがlsviなどのコマンドを実行している状態。
  2. バックグラウンドジョブ

    • ターミナルを占有せず、バックグラウンドで動作するタスク。&をつけてコマンドを実行することで作成されます。

ジョブ管理コマンド

  • ジョブの確認(jobs
    現在実行中または停止中のジョブを一覧表示します。

    jobs
    

    [1]+  Running                 ./script.sh &
    [2]-  Stopped                 vi file.txt
    
  • バックグラウンド実行(&
    コマンドの末尾に&をつけると、バックグラウンドで実行されるジョブが作成されます。

    ./script.sh &
    
  • フォアグラウンドに戻す(fg
    一時停止中またはバックグラウンドで実行中のジョブをフォアグラウンドに戻します。

    fg %1
    

    → ジョブID1のジョブをフォアグラウンドで再開します。

  • ジョブの一時停止(Ctrl+Z
    実行中のフォアグラウンドジョブを一時停止します。

  • ジョブの再開(bg
    一時停止中のジョブをバックグラウンドで再開します。

    bg %2
    

    → ジョブID2をバックグラウンドで再開します。

  • ジョブの終了(kill
    特定のジョブを終了します。ジョブIDを指定して使用します。

    kill %1
    

    → ジョブID1を終了します。

使用例

  1. スクリプトをバックグラウンドで実行:

    ./script.sh &
    
  2. 実行中のジョブを確認:

    jobs
    
  3. 停止中のジョブをバックグラウンドで再開:

    bg %1
    
  4. ジョブを終了:

    kill %2
    

ジョブ管理の特徴

  • 柔軟な管理:ジョブの状態を切り替えたり、中断したり、再開したりできる。
  • 効率的な作業:バックグラウンドでタスクを実行しつつ、ターミナルを占有せず他の作業を並行して行える。

ジョブスケジューラ

  • cron:Linuxで定期的にコマンドやスクリプトを自動実行するためのジョブスケジューラーです。
    • **crontab**コマンドを使用して、スケジュールを設定します。

    • 例1:毎日午前3時にスクリプトを実行

      crontab -e
      

      内容

      0 3 * * * /path/to/script.sh
      

      → 毎日午前3時に/path/to/script.shを実行します。

    • 例2:毎週月曜日の正午に特定のコマンドを実行
      内容

      0 12 * * 1 echo "Hello, Monday!" >> /path/to/log.txt
      

      → 毎週月曜日の正午に「Hello, Monday!」をログファイルに追記します。

    • 例3:10分ごとにスクリプトを実行
      内容

      */10 * * * * /path/to/another_script.sh
      

      → 10分ごとに/path/to/another_script.shを実行します。

cronの特徴:

  • 定期的なタスク実行:指定したスケジュールに従い、自動的にコマンドやスクリプトを実行。
  • 柔軟なスケジューリング:分、時間、日、曜日など、細かくスケジュールを設定可能。
  • 背景で動作:ユーザーがログインしていなくてもバックグラウンドでタスクが実行されます。

cronを活用することで、バックアップやログ整理、定期的な更新作業などを効率的に自動化できます。

ユーザー管理とパーミッションの仕組み

ユーザー管理とパーミッション

ユーザーやグループ管理の方法、特殊なパーミッション設定についても解説します。これらを理解することで、Linuxシステムのアクセス制御やセキュリティ設定を効率的に行えるようになります。

権限管理(パーミッション)

Linuxでは、ファイルやディレクトリに対して「誰が」「どのように操作できるか」を設定するための仕組みをパーミッションといいます。これにより、アクセスや操作を制御することで、システムの安全性を確保できます。

パーミッションの種類

ファイルやディレクトリには以下の3つの権限があります:

  1. 読み取り(r, read)

    • ファイルの内容を閲覧したり、ディレクトリ内のファイル一覧を確認できます。
  2. 書き込み(w, write)

    • ファイルの内容を変更したり、ディレクトリ内にファイルを追加・削除できます。
  3. 実行(x, execute)

    • ファイルを実行(プログラムやスクリプトとして)したり、ディレクトリにアクセスして中身を操作できます。

パーミッションの確認方法

ls -lコマンドを使うと、ファイルやディレクトリの権限を確認できます。

例:

-rwxr-x---  1 admin staff 67890 kano 05 12:00 script.sh

権限を表している部分は、先頭の文字列 -rwxr-x--- です。この文字列は、ファイルに設定された権限を次のように示しています:

  • オーナー(rwx

    • ファイルの作成者や所有者を指し、rwxで「読み取り、書き込み、実行」が可能であることを表しています。
  • グループ(r-x

    • 所属グループのメンバーを指し、r-xで「読み取りと実行のみ」が可能であることを表しています。
  • その他(---

    • オーナーやグループに属さない全ユーザーを指し、---で「一切の操作が不可」であることを意味します。

この場合、ファイル script.sh の詳細は次の通りです:

  • オーナー: admin
    オーナーは読み取り、書き込み、実行すべて可能(rwx)。

  • グループ: staff
    グループのメンバーは読み取りと実行のみ可能(r-x)。

  • その他のユーザー:
    オーナーやグループに属さない全てのユーザーはアクセスできません(---)。

このように、Linuxではパーミッションを活用することで、セキュリティを高めながら柔軟にアクセス制御を行うことができます。

  1. 権限を確認
    ls -l sample.txt
    
  2. 書き込み権限を追加
    chmod +w sample.txt
    

パーミッションの変更

ファイルやディレクトリの権限は、chmodコマンドを使って変更できます。変更内容の指定方法には、シンボリックモード数値モードがあります。

シンボリックモードで変更

権限を文字で指定する方法です。

  • 構文

    chmod [カテゴリ][操作][権限] ファイル名
    
  • 権限のカテゴリ

    • u:オーナーの権限
    • g:グループの権限
    • o:その他のユーザーの権限
    • a:全ユーザーの権限
  • 権限の操作

    • +:権限を追加
    • -:権限を削除
    • =:指定した権限に設定
    • その他のユーザーに実行権限を追加:
      chmod o+x example.txt
      
    • グループの書き込み権限を削除:
      chmod g-w example.txt
      

数値モードで変更

権限を3桁の数値で指定する方法です。

  • 権限の数値対応表

    • 読み取り(r):4
    • 書き込み(w):2
    • 実行(x):1
    • オーナーにすべての権限(4+2+1)、グループとその他に読み取り権限のみ(4)を付与:
      chmod 744 example.txt
      

オーナーとグループの管理

オーナーとグループ

ファイルのオーナーやグループを管理することで、より柔軟なアクセス制御が可能になります。

グループの作成

新しいグループを作成するには、groupaddコマンドを使います。

  • 構文
sudo groupadd [グループ名]
  • 例(開発者のグループを作成)
sudo groupadd developers
  • 現在のグループ一覧を確認
cat /etc/group

ユーザーの作成

新しいユーザーを作成するには、useraddコマンドを使用します。

  • 構文
sudo useradd -m -s /bin/bash [ユーザー名]
  • 例(kanoというユーザーを作成する場合:)
sudo useradd -m -s /bin/bash kano

-m: ホームディレクトリを作成します。
-s: デフォルトのシェル(例:/bin/bash)を指定します。

ユーザーのパスワードを設定

ユーザーにパスワードを設定するには、passwdコマンドを使用します。

  • 構文
sudo passwd [ユーザー名]
  • 例(kanoというユーザーを作成する場合:)
sudo passwd kano

コマンドを実行すると、2回パスワードの入力を求められます。

ユーザーをグループに追加

ユーザーをグループに追加するには、usermodコマンドを使用します。

  • 構文
sudo usermod -aG [グループ名] [ユーザー名]
  • 例(kanoというユーザーを開発者のグループに追加する場合:)
sudo usermod -aG developers kano

ファイルのオーナーを変更

ファイルのオーナーを変更するには、chownコマンドを使用します。

  • 構文

    chown [新しいオーナー] ファイル名
    
  • chown kano example.txt
    

chgrpコマンド

ファイルのグループを変更します。

  • 構文

    chgrp [新しいグループ] ファイル名
    
  • chgrp group2 example.txt
    

特別なパーミッション

特別なパーミッション

Linuxでは、通常のパーミッションに加えて、以下の特殊なパーミッションを設定できます。

SUID(Set User ID)

ファイルの実行時に、そのオーナーの権限で動作します。

  • 用途:特定のプログラムに管理者権限を一時的に付与。
  • 設定例
    chmod u+s /path/to/program
    

SGID(Set Group ID)

ファイルやディレクトリを実行する際、そのグループの権限で動作します。

  • 用途:グループのアクセス制御を統一。
  • 設定例
    chmod g+s /path/to/directory
    

Stickyビット

ディレクトリ内のファイルを、作成者のみが削除可能にする。

  • 用途:共同作業用ディレクトリのセキュリティ強化。
  • 設定例
    chmod +t /shared_directory
    

Discussion