Linux演習 – ファイル操作
Linux演習サーバへの接続
Unix(Linux)は、インターネットでのサーバとして広く活用されている。Linuxを試すには、Windows ならば WSL や Cygwin であったり、Mac でも使える仮想OSの VMware, VirrtualBox を使うこともでる。今回の演習では、全員が同じ環境で使うために、クラウド環境にサーバを準備した。クラウドのunixサーバを利用する場合には、リモートログインのための ssh が一般的である。
一方、教室のWiFi環境では、HTTP,HTTPS の通信しか使えないことから、ssh が通常利用できない。そこで、この演習では、特殊な使い方だが、HTTPS(443) ポートを使う。
Windows 10 ならば、cmd.exe , macOS ならば、ターミナルソフトを起動し、以下の操作を行う。
$ ssh -p 443 ゲストID@演習サーバ
- 演習サーバの接続方法(学内のみ) – サーバへの攻撃を極力へらすために非公開。
- 今回の演習では、センターIDではなくゲストIDを使います。
- ゲストIDのパスワードは、こちらのファイル(Teams)を参照。(2021-3EI Teams)
- パスワード入力時にタイプミスした時は、Ctrl-U で最初から入力のやり直しができる。
ファイル操作の基本
まずは基本操作をしてみよう。ls コマンド(list) は、ディレクトリ内にあるファイルの一覧を表示する。cat コマンド(catalog)は、指定されたファイルの内容を表示する。
s53599xx@nitfcei:~$ ls helloworld.c Maildir public_data public_html s53599xx@nitfcei:~$ ls -l total 8 -rw-r--r-- 1 s53599xx students 76 Dec 21 14:30 helloworld.c drwx------ 5 s53599xx students 4096 Dec 21 14:30 Maildir (略) s53599xx@nitfcei:~$ cat helloworld.c #include <stdio.h> int main() { printf( "Hello World\n" ) ; return 0 ; } s53599xx@nitfcei:~$
ファイルをコピーするには cp コマンド(copy)、不要なファイルを消すには rm コマンド(remove)を使う。
s53599xx@nitfcei:~$ cp helloworld.c test.c s53599xx@nitfcei:~$ ls -l total 8 -rw-r--r-- 1 s53599xx students 76 Dec 21 14:30 helloworld.c drwx------ 5 s53599xx students 4096 Dec 21 14:30 Maildir -rw-r--r-- 1 s53599xx students 76 Dec 21 14:40 test.c (略) s53599xx@nitfcei:~$ rm test.c s53599xx@nitfcei:~$ ls -l total 8 -rw-r--r-- 1 s53599xx students 76 Dec 21 14:30 helloworld.c drwx------ 5 s53599xx students 4096 Dec 21 14:30 Maildir s53599xx@nitfcei:~$
ファイル詳細表示の説明
ls -l で表示される詳細の内容は以下の通り。
属性 | リンク数 | 所有者 | グループ | サイズ | 日付 | ファイル名 |
---|---|---|---|---|---|---|
– rw- r– r– | 1 | s53599xx | students | 76 | Dec 21 14:30 | helloworld.c |
d rwx — — | 5 | s53599xx | students | 4096 | Dec 21 14:30 | Maildir |
– | d | -: 通常ファイル, d:ディレクトリ | ||||
rw- | rwx | 所有者が r:読み出し, w:書き込み, -: 権限なし ファイルなら、x:実行可能 ディレクトリなら、x:ディレクトリに入れる |
||||
r – – | – – – | グループの rwx の属性 r– は 読み込みだけ許可 | ||||
r – – | – – – | その他の rwx の属性 — は、読み書き禁止 |
基本的なファイル操作コマンド一覧
操作 | Linux | Windows |
---|---|---|
ディレクトリ一覧(list) ディレクトリ詳細 |
ls 場所 ※ ls -l 場所 |
dir /w 場所 ※ dir 場所 |
※ 省略時はカレントディレクトリ | ||
ファイル表示(catalog) | cat 場所 | type 場所 |
ファイルコピー(copy) | cp コピー元 コピー先 cp コピー元 コピー先ディレクトリ |
copy コピー元 コピー先 |
ファイル削除(remove) | rm 場所 | del 場所 |
ディレクトリ作成(make dir) | mkdir 場所 | md 場所 |
ディレクトリ削除(remove dir) | rmdir 場所 | rmdir 場所 |
カレントディレクトリ移動 (change directory) |
cd 場所 | cd 場所 ドライブの場合は ドライブ名: |
所有者を変更(change owner) | chown 所有者 場所 | |
グループを変更(change group) | chgrp グループ 場所 | |
属性を変更(change mode) | chmod 属性 場所 | ←属性の書き方 |
ワイルドカード文字
ls などのコマンドで、複数のファイルを対象とするとき、ワイルドカード文字が使える。
任意の1文字 ? |
(例) $ ls # 全部のファイル aaa.c ab.c abc.c bcd.c defgh.c hij.cxx $ ls a?.c # aで始まる2文字のC言語ファイル ab.c $ ls ???.c # 3文字のC言語のファイル aaa.c abc.c bcd.c |
任意の文字 * |
(例) $ ls a*.c # aで始まるC言語ファイル aaa.c ab.c abc.c $ ls *.cxx # 拡張子が.cxxのファイル(C++) hij.cxx |
相対PATHと絶対PATH
ファイルの場所を指定するには、2つの方法がある。
絶対PATHは、木構造の根(ルートディレクトリ / で表す) からの経路のディレクトリ名を”/”で区切って書き連ねる。ルートディレクトリからの場所であることを示すために、先頭を / で始める。住所を /福井県/越前市/宮谷町/斉藤家 と書くようなもの。
相対PATHは、現在注目しているディレクトリ(カレントディレクトリと呼ぶ)からの経路を書く。住所でいうと、/福井県/越前市 に注目している状態で、宮谷町/斉藤家 と書くようなもの。
ただし、/福井県/福井市 に注目している状態で、片町/山本家 は1つのファイルでも、/福井県/福井市/片町/山本家 とは別に /石川県/金沢市/片町/山本家 があるかもしれない。
上記の絵であれば、/home/tsaitoh/helloworld.c を、相対PATHで書く場合、s53599xx の一つ上にさかのぼって場所を指定することもできる。一つ上のディレクトリ(親ディレクトリ)は .. (ピリオド2つ)
この場合、” $ cat ../tsaitoh/helloworld.c ” の様な相対PATHでもアクセスできる。
カレントディレクトリ自身を表す場合は、. (ピリオド1つ)を使う。
/home/s53599xx/helloworld.c の場所は、” $ cat ./helloworld.c ” と書くこともできる。
CTF風に演習
ここで、ディレクトリの場所の書き方が理解できたかを練習してみよう。
/home0/Challenge/1-CTF.d の下にフォルダがいくつかあり、その中にさらにファイルがある。このファイルの中には、FLAG{なんとか} と書いた部分がある。この「なんとか」の部分を速く見つけ出して答えよう。
上記フォルダには、5つの問題 Task1 , Task2 , Task3 , Task4 , Task5 がある。
Task2 , Task3 では、以下のコマンドを使う。(ヒントはTaskフォルダの0ReadMeを読め)
操作 | Linux |
---|---|
ページャで表示(空白で次のページ,qで停止) | more ファイルの場所 |
元に戻れるページャ(less) | less ファイルの場所 |
多機能ページャ(文字コード判別) | lv ファイルの場所 |
漢字コード変換 | nkf ファイルの場所 nkf -j ファイル JISコードで表示 nkf -s ファイル Shift-JISコードで表示(Windows) nkf -e ファイル EUCコードで表示 nkf -w ファイル UTF-8 で表示(Mac,Linux) |
Task4 , Task5 には、難易度をあげるためのトリックがしかけてある。(ヒント 0ReadMe)
授業内レポート
- 自分でみつけられたフラグを以下の様に答えよ。(できた所までで良い)
Task1 = FLAG{なんとか}
Task2 = … - Task1 で答えを見つけるまでに実行したコマンドとその途中結果を簡単にまとめよ。
できれば、実行したコマンドを、相対PATH形式、絶対PATH形式で答えよ。
$ cd /home0/Challenge/1-CTF.d/Task1
$ ls
0ReadMe brain concussion persons
history コマンドは、過去に実行したコマンドを表示してくれる。
Error Establishing a Database Connection
びびった。
この WordPress で、特に何もしていないのに、「データベース接続の確立エラー」(Error Establishing a Database Connection)
が表示された。コレが出ると、データベースファイルが壊れたとかの場合が多くて、復旧に手間取る可能性が高い。
今回は、サーバに login して、MySQL の Restart だけで復帰した。
払い下げPCへのddを使ったディスクイメージコピー
総合情報処理センターのパソコンの入れ替えにより、払い下げとなったパソコンのセットアップ中。
1台をWindows10などの環境を整えて、あとは、USBブートのUbuntuを使って、HDDを全コピー。
最初、SATA のケーブルを、コピー元=SATA0 と、コピー先=SATA1 につないでコピーをしたら、同一バスを使うからかな!?やたらと時間がかかり、1台あたり 290分かかった。
$ time sudo dd if=/dev/sda of=/dev/sdb 289min...
2度目からは、コピー元=SATA0で、コピー先=SATA1を、コピー先=SATA3に変更して、ついでにコピー単位を256kB に変更して行う。
$ time sudo dd if=/dev/sda of=/dev/sdb bs=256k 78min...
バッファーサイズが効果的だったのか、SATA3 にしたのが良かったのか…はよく判らないけど、コピー時間を1/3に短縮できた。
でも、残りあと10台以上セットアップは続く。卒業式が始まる前に、1ローテーション回してから、式に向かう。まだまだあるし、もう1つUbuntuのUSBを準備し、2台並行作業を開始。
ネットワークセキュリティのためのTips
- デーモン(ネットワークサービス)の起動
- rc.d(古い方法)
- systemd(新しい方法)
- スーパーサーバによる起動
- ファイアウォール
- 検査手法
- Linuxで開いているポートを確認する方法(netstat)
- ポートスキャン
- パケットキャプチャ
- Webサーバへの攻撃方法
- 一般的な知識
- バックドアの確認方法
- 仕掛けられたバックドアの検出と対処
- maldetect
- ルートキット検出ツールの比較(rkhunter,chkrootkit)
usacloud
さくらのクラウド上のサーバを、実験・演習用に使っているけど、未使用時に起動していると課金も増えるので、極力電源を落としたい。調べると、さくらのクラウドであれば usacloud という CLI により操作ができるみたい。
同じネタを「機構管理の Azure のサーバでも極力電源を落とせ」と言われているけど、利用者のいるWebサーバなので困難。
APIキーの取得
usacloud の説明を見ているけど、API キーの取得画面の出し方が変更になっているみたい。さくらのクラウドホームにて、APIキーを発行
usacloud のインストール
usacloud のドキュメントには、
curl -fsSL https://releases.usacloud.jp/usacloud/repos/install.sh | bash
と書かれていたけど、debian の apt の GPG エラーでインストールに失敗したので、usacloud_0.31.1-1_all.deb をダウンロードし、dpkg -i *.deb でインストール。
先の手順で作ったAPIキーを登録
[root]# usacloud config Setting SakuraCloud API Token => Enter token: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Setting SakuraCloud API Secret => Enter secret: xxx...xxx Setting SakuraCloud Zone => Enter zone[is1a/is1b/tk1a/tk1v]: is1b Setting Default Output Type => Enter default-output-type[table/json/yaml/csv/tsv]: json Written your settings to /root/.usacloud/default/config.json
サーバの操作コマンド
設定が終われば、サーバの起動や停止もコマンド一発
((( サーバの起動 ))) $ sudo usacloud server boot 名前 $ sudo usacloud server wait-for-boot 名前 ((( シャットダウン ))) $ sudo usacloud server shutdown 名前 $ sudo usacloud server wait-for-down 名前 ((( サーバ一覧 ))) $ sudo usacloud server list $ sudo usacloud server list -q 11xxxxxxxxxx $ sudo usacloud server list --output-type table +--------------+---------+-----+--------+------------+--------------------+--------+----------------+ | ID | Name | CPU | Memory | Commitment | IPAddress | Status | Host | +--------------+---------+-----+--------+------------+--------------------+--------+----------------+ | 11xxxxxxxxxx | nitfcei | 2 | 2048MB | standard | xxx.xxx.xxx.xxx/24 | up | sac-xxxx-xxxxx | +--------------+---------+-----+--------+------------+--------------------+--------+----------------+ $
VMware PlayerでLinux
授業の中で unix 環境を体験してもらうために、vmware player を使う準備
VMware Workstation Playerのインストール
- VMware Workstation Playerのページ より、Windows(無償版)をダウンロードし、インストールを行う。
Ubuntu 18 Desktop 版の起動イメージ
起動した状態のイメージを作っておきたかったが、Freeの環境では無理っぽいな。インストール作業を授業時間内にやるか…
nfsのソフトマウント
自室の Linux サーバでは、自分が管理している Azure 上のサーバのデータバックアップを取っているが、ハードディスク容量が巨大な訳でもないので、iMac に接続された Drobo (複数ディスクの改良RAID?) に保存させている。
このネットワーク越しのバックアップでのディスクアクセスになるが、iMac を時々再起動させると、その間に icinga のディスクチェック処理が走った際に、アクセスできないために df プロセスが大量に残るトラブルが発生していた。リトライするため CPU 負荷も高い状態で、一番簡単なのは サーバの再起動。(iMacを再起動したら、その後にLinuxサーバを再起動….無駄や…)
最初は、check_disk 処理で余計なところを見させないために、特定マウント先を無視するオプションを加えていたが、df がマウント先をしつこくアクセスをリトライするのが原因。
よく考えたら、ネットワーク越しのマウントだから、ハードマウント(ディスクアクセスに失敗したら何度もリトライ)ではなく、ソフトマウント(複数回リトライしたら諦める)にする必要がある。
ということで、automount オプションに、”soft” オプションを加えて解決。
MySQLでトラブル対応
仕事で動かしているサーバが動いていないとの連絡が入り、システムが動いていない。
他の方との共同のネタなので、サーバーの更新は慎重に行っているけど、今回は MySQL が落ちているのが原因。サーバーの定期的な更新作業後あたりから動かなくなっているので、最近更新されたパッケージを確認し、MySQL が含まれていたのでパッケージを一つ前のバージョンに落とそうと対応を行った。
しかしダウングレードでパッケージの不整合が出る中、無理やりダウングレードをおこなって MySQL を起動させようとするが、”mysqld got signal 11 ; This could be because you hit a bug.” といったメッセージで起動しない。
四苦八苦するも原因がつかめず、以前の状態に戻そうとバックアップ時に作成しておいたパッケージのバージョン情報を確認すると、パッケージが更新されて動かなくなったのではなく、パッケージが消されていたことが判明。原因を誤解していた。
OSの更新作業の中で、MySQL のメジャー更新で使っていたバージョンが標準パッケージから外されたみたい。メジャー更新すればいいのだろうけど、運用不安もあるので、MySQL の本家で公開しているパッケージを入れて、無事復旧。
長期運用とはいえ、更新は慎重に作業せねば。
gcj (GNU Compiler for Java) の使い方
いつもは Java を使わないけど、久々に java のプログラムの動作実験と思い、サーバ機に gcj (GNU Compiler for Java)を入れて使おうとしたら、コンパイラ javac とバイトコードインタプリタ java のつもりでコマンドを探すけど、見つからない。
gcj を見つけて “gcj HelloWorld.java” ってやってみたけど動かない。あらためて確認したら、バイトコード生成もできるし、直接機械語も生成できるけど、色々とオプション指定がいるみたい。なるほど。
// HelloWorld.java public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } }
# 機械語を直接生成する場合 $ gcj -o HelloWorld --main=HelloWorld HelloWorld.java $ ls HelloWorld HelloWorld.java $ ./HelloWorld Hello World! # バイトコードを生成して動かす場合 $ gcj -C HelloWorld.java $ ls HelloWorld.class HelloWorld.java $ gij HelloWorld Hello World!
プロセス状態 I (Idle Kernel Thread)
自宅のサーバの状態を見ていたら、青:sleep 灰:total の間の差が大きい。
変なプロセス走っていないかと心配したら、ps ax の出力でのステータスがIとかI< となっている項目。日本語のマニュアルを見ても意味不明。
英語のマニュアルを見たら、”Idle Kernel Thread”らしい。