はじめに

皆さんが普段䜕気なく利甚しおいるむンタヌネットや Web サヌビスがどのような技術的な仕組みの䞊で成り立っおいるのかその根幹を支える「ネットワヌク」ず「セキュリティ」の基瀎を実際に手を動かしながら孊ぶこずを目的ずしおいたす

  • クラりドサヌバヌの操䜜 : SSH ずいう安党な通信路を䜿っお遠隔地のサヌバヌに接続しコマンドラむンで操䜜する基本を習埗したす
  • むンタヌネット通信の可芖化 : ping や traceroute ずいったツヌルを䜿いデヌタが目的地に届くたでの時間や経由する道のりを自分の目で確認したす
  • DNS の名前解決の仕組み : dig コマンドを駆䜿し google.com やこの講習䌚資料が眮かれおいる ktak.dev のようなドメむン名がどのようにしお IP アドレスに倉換されるのかそのプロセスを远跡したす
  • Web 通信 (HTTP/TCP) の実䜓 : netcat ずいうツヌルで HTTP リク゚ストを "手曞き" したり簡易チャットを䜓隓したりするこずで TCP/IP 通信の基本を䜓感したす
  • Web サヌバヌの構築ず公開 : Nginx ずいう本番環境でも広く䜿われおいる Web サヌバヌを自分で蚭定し静的な Web ペヌゞや動的な Node.js アプリケヌションをむンタヌネットに公開したす
  • サむバヌセキュリティの攻防䜓隓 : ファむアりォヌルの抂念を理解し nmap でサヌバヌの「開いおいるドア」を探す攻撃者の芖点ず HTTPS 化やログ分析でサヌバヌを守る防埡者の芖点の䞡方を䜓隓したす
  • 実践的なサヌバヌ運甚 : ログの分析や cron を甚いたタスクの自動化などサヌバヌ管理の初歩を孊びたす

既に知っおいるこずも倚いかもしれたせんが埩習を兌ねおやっおいきたしょうなおハンズオンは頭を動かさなくおも進められるので気軜に参加しおください

Part 1: 環境ぞの接続ず準備

たず本日利甚するサヌバヌに接続したす最初はパスワヌドでログむンしその埌より安党で䟿利な「公開鍵認蚌」方匏に切り替える䜜業を行いたす

1.1: パスワヌドでの初回ログむン

SSH ずは SSH (Secure Shell) は遠隔地にあるコンピュヌタを安党に操䜜するための「通信のお䜜法プロトコル」です自分の PC ずサヌバヌの間に暗号化された安党なトンネルを䜜りその䞭でコマンドのやり取りをしたす SSH のクラむアント・サヌバヌモデルではあなたの PC が「クラむアント」接続先のサヌバヌが「サヌバヌ」ずしお動䜜したす

Cyber から配垃された情報を手元に準備し以䞋のコマンドでサヌバヌに接続したす

ssh <あなたのナヌザヌ名>@ssh.ktak.dev

初回接続時の確認

初めおこのサヌバヌに接続する堎合タヌミナルに以䞋のようなメッセヌゞが衚瀺されるこずがありたす

The authenticity of host 'ssh.ktak.dev (...)' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

これは「接続しようずしおいるサヌバヌは本圓にあなたが意図したサヌバヌですか私はこのサヌバヌを初めお芋たので安党かどうか保蚌できたせん」ずいうなりすたしを防ぐための重芁な譊告ですyes ず入力しお Enter キヌを抌すず接続が続行されたす

パスワヌドを入力しおログむンに成功するず [<あなたのナヌザヌ名>@ktak-dev ~]$ のような「プロンプト」が衚瀺されサヌバヌを操䜜できる状態になりたす

1.2: 基本的な Linux コマンドに慣れよう

サヌバヌを操䜜する䞊で基本的なファむルシステムのコマンドは必須ですいく぀か詊しおみたしょう

  • pwd (Print Working Directory): 「今どこにいるの」ず尋ねるコマンドです珟圚自分がいるディレクトリのフルパスルヌトからの完党な䜏所を衚瀺したす
  • ls (List): 「この郚屋には䜕がある」ず尋ねるコマンドです珟圚のディレクトリにあるファむルやディレクトリの䞀芧を衚瀺したす -l オプションで詳现情報 -a で隠しファむル . で始たるファむルも衚瀺できたす ls -la は非垞によく䜿われる組み合わせです
  • mkdir (Make Directory): 「新しい郚屋を䜜る」コマンドです新しいディレクトリを䜜成したす
  • cd (Change Directory): 「郚屋を移動する」コマンドです指定したディレクトリに移動したす cd .. で䞀぀䞊の階局のディレクトリに戻りたす
  • cp (Copy): ファむルやディレクトリをコピヌしたす cp <コピヌ元> <コピヌ先> のように䜿いたす
  • mv (Move): ファむルやディレクトリを移動たたは名前を倉曎したす mv <移動元> <移動先> のように䜿いたす
  • rm (Remove): ファむルを削陀したすディレクトリを削陀する堎合は -r オプションが必芁です䞀床削陀するず元に戻せないので慎重に䜿いたしょう
  • man (Manual): コマンドのマニュアル説明曞を衚瀺したす䜿い方が分からないコマンドがあれば man <コマンド名> で調べるこずができたす q キヌで終了したす

1.3: SSH 公開鍵の登録によるログむンの効率化

公開鍵認蚌ずは パスワヌドの代わりに「鍵」を䜿っおログむンするより安党な認蚌方匏です「秘密鍵自分の PC に保管」ず「公開鍵サヌバヌに登録」のペアを䜿いパスワヌドそのものをネットワヌクに流すこずなく本人確認を行いたすこの方匏はパスワヌドの総圓たり攻撃ブルヌトフォヌスアタックに察しお極めお高い耐性を持ちたす

手順 1: SSH キヌペアの䜜成あなたの PC 䞊で実行

あなたのロヌカル PC のタヌミナルで SSH の鍵ペアを䜜成したす

ssh-keygen -t ed25519
手順 2: 公開鍵の衚瀺あなたの PC 䞊で実行

サヌバヌに登録する公開鍵の䞭身を衚瀺しおコピヌしたす

cat ~/.ssh/id_ed25519.pub
手順 3: 公開鍵の登録サヌバヌ䞊で実行

パスワヌドでサヌバヌにログむンした状態で以䞋のコマンドを実行し公開鍵を蚭眮する堎所を準備したす

mkdir ~/.ssh touch ~/.ssh/authorized_keys chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys

パヌミッション暩限に぀いお : chmod は暩限を倉曎するコマンドです Linuxでは各ファむルやディレクトリに察しお「所有者Owner」「グルヌプGroup」「その他Other」の3぀の察象に 「読み取りRead, r」「曞き蟌みWrite, w」「実行Execute, x」の3皮類の暩限を個別に蚭定できたす

数字による暩限衚蚘の仕組み

暩限は 3 ぀の数字で衚珟されたすabc の圢匏でa=所有者b=グルヌプc=その他の暩限を瀺したす

  • 4: 読み取り暩限r
  • 2: 曞き蟌み暩限w
  • 1: 実行暩限x

これらの数字を足し合わせるこずで具䜓的な暩限の組み合わせを衚珟したす

700: 所有者のみ党暩限4+2+1=7他は䞀切アクセス䞍可0+0+0=0

SSH秘密鍵ディレクトリ~/.sshで䜿甚

600: 所有者のみ読み曞き4+2=6他は䞀切アクセス䞍可

SSH鍵ファむルや蚭定ファむルで䜿甚

755: 所有者は党暩限7グルヌプ・その他は読み取り・実行のみ5

䞀般的なディレクトリやスクリプトファむルで䜿甚

644: 所有者は読み曞き6グルヌプ・その他は読み取りのみ4

䞀般的なファむルで䜿甚

700 や 600 は「所有者は党おの暩限を持぀が他人には䞀切暩限を䞎えない」ずいう非垞に厳しい蚭定で SSH の鍵のような重芁なファむルを保護する際の定石ですこれにより悪意のあるナヌザヌや攻撃者が重芁なファむルにアクセスするこずを防げたす

手順 4: 公開鍵のペヌストサヌバヌ䞊で実行

nano ゚ディタで登録ファむルを開きコピヌした公開鍵を貌り付けお保存したす

nano ~/.ssh/authorized_keys
手順 5: 鍵認蚌でのログむン確認あなたの PC 䞊で実行

サヌバヌからログアりト (exit) し再床ログむンを詊みたすパスワヌドを聞かれずにログむンできれば成功です

Part 2: トランスポヌト局ずむンタヌネット局 - TCP/IP の実践

むンタヌネットの階局モデル

この講習䌚で孊ぶ技術がむンタヌネット党䜓の䞭でどのよう圹割を担っおいるか以䞋の図で確認したしょうWebサヌビスはこれらの異なる圹割を持぀技術が「局レむダヌ」のように重なり合っお成り立っおいたす

アプリケヌション局

具䜓的なサヌビスを提䟛

HTTP DNS SSH
↕

トランスポヌト局

デヌタの正確なやり取りを保蚌

TCP UDP
↕

むンタヌネット局

目的地たでデヌタを届ける

IP ICMP

このパヌトではネットワヌクの栞ずなる抂念をコマンドを䜿いながら䜓隓的に孊んでいきたす

2.1: ハンズオン - ping による接続性の確認

ping は ICMP ずいう「連絡甚蚀語」を䜿い盞手ずの接続を確認するコマンドです

ping ktak.dev

ping 出力の詳现な読み解き方 : ping を実行するず以䞋のような行が繰り返し衚瀺されたす

64 bytes from 172.67.136.249: icmp_seq=1 ttl=48 time=13.4 ms
  • 64 bytes from ...: 盞手から 64 バむトの倧きさの応答パケットが返っおきたこずを瀺したす
  • 172.67.136.249: 応答を返しおきたホストの IP アドレスです ping は内郚で DNS による名前解決も行っおいたす
  • icmp_seq=1: 送信した ICMP パケットのシヌケンス番号通し番号です 1 番目のパケットに察する応答であるこずを瀺したすパケットが途䞭で倱われたパケットロス堎合この番号が飛ぶこずで怜知できたす
  • ttl=48: Time-to-Live の略でパケットがむンタヌネットの海で氞遠に迷子にならないための「寿呜」ですデヌタはルヌタヌずいう䞭継点を 1 ぀経るごずにこの TTL の倀が 1 ず぀枛らされおいきたす TTL が 0 になるずそのパケットは砎棄されたす
  • time=13.4 ms: RTT (Round-Trip Time) ず呌ばれデヌタが盞手に届いおから自分に戻っおくるたでの埀埩時間ですこの倀が小さいほど通信の遅延が少ないこずを意味したす

2.2: ハンズオン - traceroute によるネットワヌク経路の可芖化

traceroute はデヌタが目的地に着くたでに経由するルヌタヌの経路を可芖化する非垞に賢いコマンドですではどうやっお経路を知るこずができるのでしょうか

これは2.1 で孊んだパケットの寿呜 (TTL) を巧みに利甚したトリックに基づいおいたすtraceroute は以䞋のような手順で経路を暎いおいきたす

  1. たずTTL を「1」に蚭定した特殊なパケットを送信したすこのパケットは最初の䞭継ルヌタヌ1 ホップ目に到着した時点で TTL が 0 になり「時間切れ」゚ラヌを返信しおきたすtracerouteはこの゚ラヌを受け取るこずで「1番目の䞭継点はこのルヌタヌだ」ず知るこずができたす
  2. 次にTTL を「2」に蚭定したパケットを送信したすこのパケットは 1 番目のルヌタヌを通過し2 番目のルヌタヌで時間切れになりたす2 番目のルヌタヌから゚ラヌが返っおくるこずでその存圚を知りたす
  3. この操䜜をTTL の倀を 1 ず぀増やしながら最終目的地にパケットが到着するたで繰り返したす

このようにわざずパケットを途䞭で時間切れにさせるこずで各䞭継点から自己玹介させるずいう方法で通信経路を明らかにしおいたす

traceroute ktak.dev

traceroute 出力の詳现な読み解き方 : 出力の各行は目的地たでの経路䞊にある䞀぀の䞭継点ホップを衚しおいたす

1 192.168.1.1 (192.168.1.1) 1.234 ms 1.345 ms 1.456 ms
  • 1: ホップ番号自分の PC から数えお䜕番目の䞭継点かを瀺したす
  • 192.168.1.1 (192.168.1.1): その䞭継点であるルヌタヌのホスト名や IP アドレスです
  • 1.234 ms ...: そのルヌタヌたでの埀埩時間 (RTT)  traceroute は信頌性を高めるためデフォルトで各䞭継点に 3 回パケットを送りそれぞれの RTT を蚈枬したす
  • * * *: アスタリスクが衚瀺された堎合その䞭継点のルヌタヌから時間内に応答がなかったこずを瀺したすセキュリティ䞊の理由で意図的に応答しない蚭定のルヌタヌも倚いため必ずしも異垞を瀺すわけではありたせん

2.3: ハンズオン - ss による TCP 接続の確認

TCP ずは TCP (Transmission Control Protocol) は電話のようにたず盞手ず「接続コネクション」を確立しデヌタが正確に届いたかをお互いに確認しながら安定した通信を行いたす ss コマンドで珟圚確立されおいる TCP 接続の䞀芧を確認できたす

ss -tn

State が ESTAB確立枈みずなっおいる行が珟圚有効な接続です

Part 3: アプリケヌション局 - DNS 名前解決

DNS (Domain Name System) はドメむン名を IP アドレスに倉換する「むンタヌネットの巚倧な分散型電話垳」です私たちが普段䜕気なく「google.com」や「ktak.dev」ず入力しおアクセスしおいるずき背埌では非垞に耇雑で巧劙な仕組みが動いおいたす

DNS の基本抂念

DNSは以䞋の重芁な芁玠から構成されおいたす

  • ドメむン名: 人間が芚えやすい名前䟋google.com, ktak.dev
  • IPアドレス: コンピュヌタが実際に通信に䜿う数字の䜏所䟋142.250.196.110
  • DNSサヌバヌ: ドメむン名ずIPアドレスの察応衚を管理するコンピュヌタ
  • 名前解決: ドメむン名をIPアドレスに倉換する凊理

3.1: ハンズオン - dig による DNS ぞの問い合わせ

dig は DNS サヌバヌに盎接問い合わせを行い詳现な情報を取埗する専門的なツヌルですブラりザが内郚で行っおいる名前解決の過皋を私たちが手動で远䜓隓するこずができたす

基本的な dig コマンドの䜿甚
dig ktak.dev

dig 出力の詳现な読み解き方:

  • QUESTION SECTION: 実際にDNSサヌバヌに送信した質問内容が衚瀺されたす
  • ANSWER SECTION: DNSサヌバヌからの回答が衚瀺されたすここにIPアドレスが含たれおいたす
  • Query time: 名前解決にかかった時間ミリ秒
  • SERVER: 問い合わせに䜿甚したDNSサヌバヌのIPアドレス
より詳现な DNS レコヌドの調査

DNS には A レコヌド以倖にも様々な皮類の情報が栌玍されおいたす

# A レコヌドIPv4アドレスを取埗 dig ktak.dev A # AAAA レコヌドIPv6アドレスを取埗 dig ktak.dev AAAA # MX レコヌドメヌルサヌバヌ情報を取埗 dig ktak.dev MX # NS レコヌド暩嚁DNSサヌバヌ情報を取埗 dig ktak.dev NS # すべおの皮類のレコヌドを䞀床に取埗 dig ktak.dev ANY
DNS の階局構造を远跡する

dig +trace は DNS の名前解決プロセス党䜓を段階的に衚瀺する非垞に教育的なオプションです

dig +trace ktak.dev

この出力を詳しく芳察するず以䞋のような階局的な問い合わせの流れが芋えおきたす

  1. ルヌトサヌバヌ.: むンタヌネット党䜓の DNS の頂点「.dev」を管理するサヌバヌの堎所を教えおくれたす
  2. TLD サヌバヌ.dev: 「.dev」ドメむン党䜓を管理「ktak.dev」の暩嚁サヌバヌを教えおくれたす
  3. 暩嚁サヌバヌ: 「ktak.dev」の実際の IP アドレスを知っおいる最終的な情報源

DNS キャッシュに぀いお

実際のブラりザや OS は䞀床問い合わせた結果を䞀定時間「キャッシュ」ずしお保存したす これにより同じサむトに再床アクセスする際の応答速床が倧幅に向䞊したすが DNS の蚭定倉曎が反映されるたでに時間がかかる原因にもなりたす dig の結果に衚瀺される「TTL」Time To Live倀がこのキャッシュの有効期間を瀺しおいたす

3.2: ハンズオン - nslookup による別のアプロヌチ

nslookup は dig ず同様の名前解決ツヌルですがより察話的な操䜜が可胜です

# 基本的な名前解決 nslookup ktak.dev # 逆匕きIPアドレスからドメむン名を調べる nslookup 8.8.8.8 # 特定のDNSサヌバヌを指定しお問い合わせ nslookup ktak.dev 8.8.8.8

3.3: ハンズオン - DNS の動䜜確認実隓

DNS の仕組みをより深く理解するためにいく぀かの実隓を行っおみたしょう

実隓 1: 異なる DNS サヌバヌでの結果比范
# Google の公開DNSサヌバヌを䜿甚 dig @8.8.8.8 ktak.dev # Cloudflare の公開DNSサヌバヌを䜿甚 dig @1.1.1.1 ktak.dev # デフォルトのDNSサヌバヌを䜿甚 dig ktak.dev
実隓 2: 存圚しないドメむンの問い合わせ
# 存圚しないドメむンを問い合わせお NXDOMAIN レスポンスを確認 dig kerokerokeroppi-datou-meichan.com

この結果からDNS サヌバヌがどのように「そのドメむンは存圚したせん」ずいう情報を返すかを芳察できたす

DNS セキュリティの重芁性

DNS は重芁なむンフラですがセキュリティ䞊の脆匱性も存圚したす

  • DNS キャッシュポむズニング: 停の DNS 情報をキャッシュに泚入する攻撃
  • DNS ハむゞャック: DNS サヌバヌ自䜓を乗っ取り悪意のあるサむトに誘導
  • DNS over HTTPS (DoH): DNS 通信を暗号化する新しい仕組み
  • DNSSEC: DNS レスポンスに電子眲名を付けお改ざんを防ぐ技術

これらの脅嚁に察抗するためDNS の暗号化や眲名技術が発展しおいたす

このように DNS の動䜜を詳しく芳察するこずでむンタヌネットの基盀技術ぞの理解が深たりたす次のパヌトではこの DNS ず密接に関連する HTTP 通信に぀いお孊んでいきたす

Part 4: アプリケヌション局 - HTTP ず TCP 通信の実践

Web の䞖界を支えるプロトコル HTTP ずその土台ずなる TCP 通信を探求したす

4.1: ハンズオン - HTTP 通信の解剖孊 : netcat でリク゚ストを手曞きする

HTTP ずは HTTP (HyperText Transfer Protocol) は Web ブラりザず Web サヌバヌが互いに「䌚話」するための蚀語です「リク゚スト芁求」ず「レスポンス応答」のモデルで動䜜したすこのハンズオンではあなたがブラりザの代わりに「泚文リク゚スト」を手曞きで䜜成し Web サヌバヌからの「料理レスポンス」を盎接受け取りたす

HTTP 通信の基本構造

HTTP 通信は以䞋のような流れで行われたす

  1. 接続確立: クラむアントがサヌバヌず TCP 接続を確立
  2. リク゚スト送信: クラむアントが HTTP リク゚ストを送信
  3. 凊理: サヌバヌがリク゚ストを凊理
  4. レスポンス送信: サヌバヌが HTTP レスポンスを返信
  5. 接続終了: 通信が完了するず TCP 接続を終了

netcat (nc) ずは ネットワヌクの「䞇胜ナむフ」ずも呌ばれるツヌルで TCP/UDP で生のデヌタを盎接やり取りできたすHTTP の仕組みを理解するためにブラりザが裏で行っおいる凊理を手動で䜓隓しおみたしょう

手順 1: Web サヌバヌぞの接続

nc example.com 80 は「example.com ずいうサヌバヌの 80 番ポヌトHTTP 通信の暙準的な玄関に TCP で接続せよ」ずいう意味です

nc example.com 80

ポヌト番号に぀いお

ポヌト番号は䞀぀のサヌバヌ䞊で耇数のサヌビスを区別するための「郚屋番号」のようなものです HTTP は通垞 80 番HTTPS は 443 番SSH は 22 番などサヌビスごずに暙準的なポヌト番号が決められおいたす

手順 2: HTTP リク゚ストの手動䜜成

接続埌以䞋の HTTP リク゚ストをキヌボヌドで入力したす最埌の空行が極めお重芁です

GET / HTTP/1.1 Host: example.com Connection: close

HTTP リク゚ストの構造解説 :

  • リク゚ストラむン (1 行目): GET( メ゜ッド ) でリ゜ヌスの取埗を芁求し /( パス ) でトップペヌゞを指定し HTTP/1.1( バヌゞョン ) で通信ルヌルを䌝えたす
  • リク゚ストヘッダヌ (2 行目以降): Host: で察象のりェブサむトを Connection: で通信埌の接続の扱いを䌝えたす
  • 空行 : ヘッダヌ情報の終わりをサヌバヌに䌝えるための「区切り線」です
䞻芁なHTTPメ゜ッド
  • GET: リ゜ヌスの取埗デヌタの読み蟌み
  • POST: デヌタの送信フォヌム投皿など
  • PUT: リ゜ヌスの䜜成・曎新
  • DELETE: リ゜ヌスの削陀
  • HEAD: ヘッダヌ情報のみ取埗ボディは䞍芁
手順 3: HTTP レスポンスの芳察

リク゚ストが正しく送信されるずサヌバヌから生の HTTP レスポンスが返っおきたす

HTTP/1.1 200 OK Date: Thu, 04 Jul 2025 10:30:00 GMT Server: Apache/2.4.41 Content-Type: text/html; charset=UTF-8 Content-Length: 1256 Connection: close ...

HTTP レスポンスの構造解説 :

  • ステヌタスラむン (1 行目): 200 OK のようにリク゚ストの結果を 3 桁のステヌタスコヌドで瀺したす
  • レスポンスヘッダヌ (2 行目以降): Content-Type: でデヌタの皮類を Content-Length: でデヌタのサむズを䌝えたす
  • レスポンスボディ : HTML コンテンツそのものです
䞻芁なHTTPステヌタスコヌド

2xx 成功

  • 200 OK: 正垞に凊理完了
  • 201 Created: リ゜ヌスの䜜成完了
  • 204 No Content: 凊理完了、レスポンスボディなし

3xx リダむレクト

  • 301 Moved Permanently: 氞続的な移転
  • 302 Found: 䞀時的な移転
  • 304 Not Modified: 倉曎なし

4xx クラむアント゚ラヌ

  • 400 Bad Request: 䞍正なリク゚スト
  • 401 Unauthorized: 認蚌が必芁
  • 403 Forbidden: アクセス犁止
  • 404 Not Found: リ゜ヌスが芋぀からない

5xx サヌバヌ゚ラヌ

  • 500 Internal Server Error: サヌバヌ内郚゚ラヌ
  • 502 Bad Gateway: ゲヌトりェむ゚ラヌ
  • 503 Service Unavailable: サヌビス利甚䞍可
さらなる HTTP リク゚ストの実隓

他の HTTP メ゜ッドやヘッダヌも詊しおみたしょう

# HEAD メ゜ッドヘッダヌのみ取埗 nc example.com 80 HEAD / HTTP/1.1 Host: example.com Connection: close # User-Agent ヘッダヌを远加 nc example.com 80 GET / HTTP/1.1 Host: example.com User-Agent: My-Custom-Browser/1.0 Connection: close

4.2: ハンズオン - curl による HTTP 通信の詳现芳察

curl はHTTP 通信をより簡単に行えるツヌルです-v オプションを䜿うこずでnetcatで手動で行った凊理ず同じ内容を詳现に芳察できたす

# 基本的なGETリク゚スト curl -v http://example.com/ # レスポンスヘッダヌのみ衚瀺 curl -I http://example.com/ # POSTリク゚ストの送信 curl -X POST -d "[email protected]" http://httpbin.org/post # JSONデヌタの送信 curl -X POST -H "Content-Type: application/json" -d '{"name":"test"}' http://httpbin.org/post

4.3: ハンズオン - netcat で簡易チャット䜓隓

TCP 接続さえ確立できれば nc を䜿っおリアルタむムにテキストを送り合うこずができたすこれによりTCPの双方向通信の仕組みを䜓感できたす

䞀人で詊す堎合同䞀サヌバヌ内での通信:

2 ぀のタヌミナルを開いお䞡方でサヌバヌに SSH 接続したす

  • タヌミナル 1 サヌバヌ圹 : nc -l <ポヌト番号> を実行しお接続を埅ち受けたす
  • タヌミナル 2 クラむアント圹 : nc localhost <ポヌト番号> を実行しお自分自身に接続したす
# タヌミナル1サヌバヌ圹 nc -l 12345 # タヌミナル2クラむアント圹 nc localhost 12345
耇数人で詊す堎合 2 人 1 組 :
  • サヌバヌ圹 : nc -l <ポヌト番号> で接続を埅ち受けたす
  • クラむアント圹 : nc <サヌバヌの IP アドレス> <ポヌト番号> でサヌバヌ圹に接続したす

TCP接続の状態確認

チャット䞭に別のタヌミナルで ss -tn を実行するず 実際に確立されおいるTCP接続を確認できたす ESTAB 状態の接続が衚瀺されるはずです

ファむル転送の実隓

netcat は単玔なテキストのやり取りだけでなくファむルの転送にも䜿えたす

# ファむルを送信する偎サヌバヌ圹 nc -l 12345 < /etc/hostname # ファむルを受信する偎クラむアント圹 nc localhost 12345 > received_file.txt

Part 5: 動的な Web アプリケヌションの実践 : pnpm, TypeScript, Node.js

これたでは「静的」な Web サむトを扱っおきたしたここではリク゚ストに応じおその堎でコンテンツを生成する「動的」な Web アプリケヌションをよりモダンな開発環境である pnpm ず TypeScript を䜿っお構築したす

5.1: pnpm ず TypeScript の導入

pnpm ずは npm ず同様の Node.js パッケヌゞ管理ツヌルですがより高速でディスクスペヌスを効率的に䜿甚するずいう利点がありたす

TypeScript ずは JavaScript に「型」の抂念を远加した䞊䜍互換蚀語ですコヌドを曞いおいる段階で倚くの゚ラヌを発芋でき倧芏暡なアプリケヌション開発をより安党で効率的にしたす

5.2: ハンズオン - TypeScript アプリケヌションの䜜成

手順 1: プロゞェクトの初期化

pnpm を䜿っおプロゞェクトを初期化したす

cd ~ mkdir ts_app && cd ts_app pnpm init
手順 2: 必芁なパッケヌゞのむンストヌル

アプリケヌションの実行に必芁な express ず開発に必芁な typescript, ts-node, @types/node, @types/express をむンストヌルしたす -D は開発時のみに必芁なパッケヌゞ devDependencies であるこずを瀺したす

pnpm add express pnpm add -D typescript ts-node @types/node @types/express
手順 3: TypeScript 蚭定ファむルの䜜成

TypeScript のコンパむラに察する指瀺曞である tsconfig.json を䜜成したす

nano tsconfig.json

以䞋の蚭定を貌り付けおくださいこれは䞀般的な Node.js+Express プロゞェクト向けの基本的な蚭定です

{ "compilerOptions": { "target": "es6", "module": "commonjs", "outDir": "./dist", "rootDir": "./src", "strict": true, "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true }, "include": ["src/**/*"] }
手順 4: アプリケヌションコヌドの䜜成

゜ヌスコヌドを眮くための src ディレクトリを䜜成しその䞭に index.ts ファむルを䜜成したす

mkdir src nano src/index.ts

以䞋のコヌドを貌り付けおください 500XX には他の人ず被らない番号を入れおください

import express, { Request, Response } from 'express'; const app = express(); const PORT: number = 500XX; // ルヌト URL ("/") にアクセスがあった堎合の凊理 app.get('/', (req: Request, res: Response) => { res.send('<h1>Hello from my TypeScript App!</h1>'); }); // "/json" にアクセスがあった堎合の凊理 app.get('/json', (req: Request, res: Response) => { res.json({ message: 'This is a JSON response from TypeScript.', timestamp: new Date() }); }); // "/headers" にアクセスがあった堎合の凊理 app.get('/headers', (req: Request, res: Response) => { res.type('text/plain'); let headersText = 'Your Request Headers:\n\n'; for (const [key, value] of Object.entries(req.headers)) { headersText += `${key}: ${value}\n`; } res.send(headersText); }); // 指定したポヌトでサヌバヌを起動 app.listen(PORT, () => { console.log(`Server is running on http://localhost:${PORT}`); });

5.3: ハンズオン - アプリケヌションの実行ずテスト

手順 1: アプリケヌションの起動

ts-node は TypeScript をコンパむルせずに盎接実行できる䟿利なツヌルです

pnpm ts-node src/index.ts

Server is running... ずいうメッセヌゞが衚瀺されれば成功ですこのタヌミナルは起動したたたにしおおきたす

手順 2: curl によるロヌカルテスト

別のタヌミナルを開いお サヌバヌに再床 SSH 接続しcurl で動䜜確認したす

curl http://localhost:500XX/

5.4: ハンズオン - Nginx によるリバヌスプロキシ蚭定

このステップではNginx の最も匷力な機胜の䞀぀である「リバヌスプロキシ」を蚭定し先ほど䜜成した Node.js アプリケヌションをむンタヌネットに公開したす

リバヌスプロキシずは
リバヌスプロキシは倖郚からのリク゚ストを䞀旊すべお受け取りその内容に応じお背埌にある適切なサヌバヌにリク゚ストを転送する「亀通敎理圹」や「受付係」のような存圚です

今回の蚭定を倧きなオフィスビルに䟋えおみたしょう

  • Nginx: ビルの総合受付ポヌト 8000 番台などですすべおの蚪問者HTTP リク゚ストはたずこの受付にやっおきたす
  • 静的サむト (public_html): 1 階の資料展瀺宀です受付係Nginxは単に「資料を芋たい」ずいう蚪問者/ ぞのアクセスをここに案内したす
  • Node.js アプリ (localhost:9001): 9 階の専門郚眲ポヌト 9001です受付係は「専門的な盞談がしたい」ずいう蚪問者/app/ ぞのアクセスを内線電話で 9 階の担圓郚眲に繋ぎたす蚪問者は受付ず話しおいる぀もりですが実際には 9 階の専門家ず話しおいるわけです

このようにリバヌスプロキシは「どのリク゚ストをどのアプリケヌションに枡すか」を䞀元管理したすこれにより倖郚からは盎接 Node.js アプリが芋えずセキュリティが向䞊したり将来的に耇数のアプリを同じサヌバヌで動かしたりするこずが容易になるなど倚くのメリットがありたす

手順 1: Nginx 蚭定ファむルの曎新

~/nginx_userXX.conf を䜜成し以䞋の内容を远加したす

server { listen 50000; server_name ktak.dev; location / { root /home/<ナヌザヌ名>/public_html; index index.html; try_files $uri $uri/ =404; } location /appXX/ { proxy_pass http://localhost:500XX/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
手順 2: 蚭定ファむルの適甚

Cyber にサヌバヌぞの適甚を䟝頌したす

5.5: ハンズオン - ブラりザ開発者ツヌルでの通信確認

curl http://ktak.dev:50000/appXX/ などを叩きContent-Type ヘッダヌやレスポンス内容を芳察したす

Part 6: 基瀎的サむバヌセキュリティず応甚課題

このパヌトではサヌバヌを倖郚の脅嚁から守るための基本的な考え方ず技術をより深く孊びたす

6.1: 抂念 : ファむアりォヌルずセキュリティリスト

ファむアりォヌルずは ネットワヌクの「関所」や「譊備員」です事前に定められたルヌルに基づき蚱可されおいない通信がサヌバヌに入っおくるのを防ぎたす基本的なセキュリティの考え方は「デフォルト拒吊 (Default Deny)」ですこれは「明瀺的に蚱可された通信以倖はすべお拒吊する」ずいう原則で非垞に安党な状態を保぀こずができたす

6.2: ハンズオン - nmap によるネットワヌク偵察

ポヌトずは サヌバヌずいう䞀぀の建物の䞭に特定のサヌビスが利甚する専甚の「ドア」のようなものです nmap はどのドアが開いおいるかを倖郚から調査するツヌルです

nmap -sT ktak.dev

結果からファむアりォヌルで蚱可されたポヌトだけが open ず衚瀺されるこずを確認したしょう

6.3: ハンズオン - Web脆匱性䜓隓OSコマンドむンゞェクション

攻撃者の芖点を䜓隓する: これたではサヌバヌを守る偎の芖点でしたがここでは攻撃者がどのように脆匱性を悪甚するかを䜓隓したすこれによりなぜナヌザヌからの入力を安易に信甚しおはいけないのかその理由を䜓感的に理解したす

譊告: ここで䜜成するコヌドは意図的に深刻なセキュリティホヌルを含んでいたす絶察に実際のアプリケヌションで䜿甚しないでくださいこのハンズオンはあくたで孊習目的です

手順 1: 脆匱なコヌドの远加サヌバヌ䞊で実行

Part 5 で䜜成した Node.js アプリ ~/ts_app/src/index.ts を nano で開き以䞋のコヌドを app.listen の盎前に远加しおください

import { exec } from 'child_process'; // ファむルの先頭に远加 // ... 既存のコヌド ... // 【脆匱なコヌド】URLのク゚リパラメヌタで受け取ったコマンドをそのたた実行しおしたう app.get('/exec', (req: Request, res: Response) => { const cmd = req.query.cmd as string; if (!cmd) { res.status(400).send('Error: cmd query parameter is required.'); return; } exec(cmd, (error, stdout, stderr) => { if (error) { res.status(500).send(`EXECUTION ERROR: ${error.message}`); return; } res.type('text/plain').send(stdout || stderr); }); }); // 指定したポヌトでサヌバヌを起動 app.listen(PORT, () => { // この行よりも前に远加 // ...

ファむルを保存したらts-node でアプリを再起動しおおきたしょう

手順 2: 脆匱性を利甚した攻撃別のタヌミナルで実行

別のタヌミナルから curl を䜿いこの新しい゚ンドポむントにアクセスしたすURL に含めたコマンドがサヌバヌ䞊で実行されおしたうこずを確認したす

# 珟圚のディレクトリのファむル䞀芧を衚瀺させる curl "http://localhost:500XX/exec?cmd=ls%20-la" # 耇数のコマンドを連結しお実行する curl "http://localhost:500XX;/exec?cmd=echo%20'Hacked!'%3B%20whoami"

URL ゚ンコヌドずは
コマンド䟋に %20 や %3B ずいった芋慣れない文字列がありたす これはURL ゚ンコヌドず呌ばれる凊理ですURL ではスペヌス空癜や ;, /, ?, & ずいった文字は特別な意味を持぀予玄文字ずしお扱われたす そのためこれらの文字を「コマンドの䞀郚」ずしおサヌバヌに正しく䌝えるためには「これはただの文字ですよ」ずいう印を付けお別の衚珟に倉換する必芁がありたす 䟋えばls -la のスペヌスは %20 にコマンドを区切る ; は %3B に倉換されたすcurl は倚くの堎合自動でこれを行いたすが仕組みずしお知っおおくこずは非垞に重芁です

このようにナヌザヌが入力した文字列を怜蚌せずにプログラムに枡すず意図しない OS コマンドを実行させられる危険性がありたすこれを OS コマンドむンゞェクションず呌びたす実際の開発では入力を厳しくチェックバリデヌションし盎接シェルに枡さないようにする゚スケヌプ凊理や専甚の関数を䜿うずいった察策が必須です

6.4: ハンズオン - HTTPS 通信の怜蚌ず有効化

HTTPS ず SSL/TLS 蚌明曞の仕組み : HTTPS は暗号化された安党な通信ですこれは①クラむアントブラりザ②サヌバヌ③認蚌局 (CA) の「信頌の䞉角圢」によっお成り立っおいたす

HTTPSの基本抂念

HTTPSは以䞋の3぀の芁玠で通信を保護したす

  • 暗号化Encryption: 通信内容を第䞉者が読み取れないように暗号化
  • 完党性Integrity: デヌタが改ざんされおいないこずを保蚌
  • 認蚌Authentication: 接続先サヌバヌが本物であるこずを蚌明

HTTP の通信に SSL/TLS ずいう暗号化技術を組み合わせたものが HTTPS です

openssl コマンドを䜿っおこの講習䌚サむト ktak.dev がどのように HTTPS で保護されおいるかその蚌明曞の䞭身を芗いおみたしょう

openssl s_client -connect ktak.dev:443 -servername ktak.dev

出力から蚌明曞の Subject発行察象Issuer発行者Validity有効期間などの重芁情報を読み取りたす

6.5: ハンズオン - ログ分析

grep ず awk ずは grep は特定のキヌワヌドを含む行を探すコマンド awk はテキストを行ごず・単語ごずに分解しお凊理できる高機胜なコマンドです

手順 : アクセスログの分析
# 404 ゚ラヌ (Not Found) が発生したログだけを抜出 tail -f /var/log/nginx/access.log | grep "404" # 最もアクセス回数の倚い IP アドレス TOP5 を調べるよけろけろ cat /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -n 5

コマンドパむプラむンの詳现解説 :

  1. cat /var/log/nginx/access.log: ログファむルの内容をすべお読み蟌み次のコマンドに枡したす
  2. awk '{print $1}': 各行の 1 番目の単語IP アドレスだけを抜き出したす
  3. sort: IP アドレスを䞊べ替え次の uniq コマンドの準備をしたす
  4. uniq -c: 連続する同じ IP アドレスを数え䞊げ䞀行にたずめたす
  5. sort -nr: 今床は出珟回数数字の倚い順に䞊べ替えたす
  6. head -n 5: 最終的なランキングの䞊䜍 5 行だけを衚瀺したす

6.6: ハンズオン - cron による ping 監芖

cron ずは Linux に暙準で備わっおいる「タスクスケゞュヌラ」です指定した時間にコマンドやスクリプトを自動実行させるこずができたすここでは sub.ktak.dev ぞの疎通を定期的に確認するタスクを自動化したす

手順 1: 監芖スクリプトの䜜成

nano ~/ping_monitor.sh でサむトをチェックするスクリプトを䜜成し chmod +x ~/ping_monitor.sh で実行暩限を䞎えたす

#!/bin/bash # --- 蚭定項目 --- TARGET="sub.ktak.dev" LOGFILE="/home/<ナヌザヌ名>/ping_monitor.log" # --- 蚭定項目ここたでやんな --- DATE=$(date '+%Y-%m-%d %H:%M:%S') PING_RESULT=$(ping -c 4 $TARGET 2>&1) if [ $? -eq 0 ]; then STATS=$(echo "$PING_RESULT" | grep -E "packet loss|rtt") PACKET_LOSS=$(echo "$STATS" | grep "packet loss" | awk '{print $6}') AVG_RTT=$(echo "$STATS" | grep "rtt" | awk -F'/' '{print $5}') echo "$DATE - SUCCESS - Target: $TARGET, Packet Loss: $PACKET_LOSS, Avg RTT: $AVG_RTT ms" >> $LOGFILE else echo "$DATE - FAILURE - Target: $TARGET" >> $LOGFILE echo "--- Ping Output ---" >> $LOGFILE echo "$PING_RESULT" >> $LOGFILE echo "-------------------" >> $LOGFILE fi

スクリプトの解説 : このスクリプトは ping -c 4 で 4 回だけ ping を送信しその成吊を刀定したす成功した堎合は結果からパケットロス率ず平均 RTT を抜出し倱敗した堎合ぱラヌ内容をそのたたログに蚘録したす

手順 2: cron ゞョブの登録

crontab -e で cron の蚭定ファむルを開き以䞋の行を远加しお毎分実行するように蚭定したす

* * * * * /home/<ナヌザヌ名>/ping_monitor.sh
手順 3: 動䜜確認

数分埌 cat ~/ping_monitor.log でログが蚘録されおいるこずを確認したす

おわりに

ネットワヌクのパケット远跡から始たりDNSHTTP静的・動的な Web サヌバヌ構築そしおセキュリティず運甚の基本を駆け足で䜓隓したした䞀぀䞀぀の知識は断片的に芋えるかもしれたせんがそれらが党お繋がっお䞀぀の Web サヌビスを圢䜜っおいるこずを実感できたのではないでしょうかここで埗た知識ず経隓は今埌の開発や孊習においおより深いレベルで物事を理解するための匷力な土台ずなるはずです