B2B
ディフェンス用メモと設定メモ。
自分のM1 Macで環境構築することは諦めた
M1 MavにはVirtual Boxが入れられない。開発中バージョンしかなく、課題の指定にあるstable版がなかった。
UTMを利用してDebianをインストールしようとしたが、「Loading initiail ramdisk…」や「Invalid virtual machine configuration. A storage device configuration is invalid.」や「display output is not active」などのメッセージが解決できなかった。
ディフェンス用メモ
仮想マシン
ホストデバイスで別のOSを動作させることができる仮想化ソフトウエア、ゲストOSによって動作する。仮想化ソフトウエアは、物理的なリソース(CPUやメモリなど)を仮想的に分割し、ホストとは別に独自のコンピュータを持っているかのように動作する。
Debian・Rocky
オープンソースのLinuxディストリビューション(Linux OSのバリエーション)。Linux OS(Linuxカーネル)だけでは足りない部分を最初から補足してくれている。Debianの方が設定が簡単。
仮想化マシンを使う理由
ホストとは異なる種類のOSでの開発、サービス利用などリソースの効率利用になる。古いOSでしか動作しないソフトの利用などもできる。
apt, apptitude
いずれもパッケージ管理システムを利用する、というコマンド。
あるソフトウエアを利用するためには、データAが必要になる、などの場合にデータAもソフトウエアと一緒にダウンロードしてくれるもの。(普段アプリをDLするときは考えもしないけど、Linuxはオープンソースゆえに自力で必要なものを集めなさいの意識が強いらしい)
その中でapptitudeはaptに機能をたくさん加えてメモリ使用量が多い。でもトラブルシューティングには向いている。
AppArmor(Application Armor)
Linux用のセキュリティモジュールで、各アプリケーションの権限やリソースへのアクセスを制御するためのもの。
パーティション
コンピュータのドライブを論理的に分割したもの。それぞれが独立したストレージエリアとして扱うことができるようになる。
複数のOSを1台のハードウエアで実行する、などに利用できる。
LVM(Logical Volume Manager)
まず、ハードディスクというのは、コンピュータの中で物を保存するための大きな収納ボックスのようなものと考えてください。そして、このボックスの中にはたくさんの引き出しがあって、それぞれに色々な物を保存します。例えば、一つの引き出しにはゲームのデータを、別の引き出しには学校の宿題を、また別の引き出しには好きな音楽を入れる、といった具体的な使い分けをします。
ただし、問題は、これらの引き出し(つまりハードディスクのパーティション)は、最初に大きさを決めてしまうと、後から簡単に大きさを変えることができないということです。つまり、ゲームのデータをたくさん保存したくなった時に、ゲームのデータを入れている引き出しを大きくするのは難しいのです。
ここで、LVMというのは、この問題を解決するための便利なツールです。LVMを使うと、引き出しの大きさを後から自由に変えることができます。つまり、ゲームのデータをたくさん保存したくなったら、LVMを使ってゲームのデータを入れている引き出しを大きくすることができます。また、もしその引き出しを小さくしたくなったら、それも可能です。これがLVMの基本的な役割です。
ちなみに、LVMはこの他にも色々な便利な機能を提供しています。例えば、複数のハードディスクをまとめて一つの大きな収納ボックス(つまり一つの大きな論理ボリューム)として使うことも可能です。
ディフェンス操作
// UFW status
sudo ufw status
// SSH status
sudo systemctl status ssh
// OS check
uname -a
// user name
id -un
// group belong
groups
// passwd rule review
sudo nano /etc/pam.d/common-password
sudo nano /etc/login.defs
// create new user
sudo adduser ->name<-
// add group
sudo groupadd evaluating
// assign
sudo usermod -aG evaluating ->name<-
// check
id ->name<- or getent group evaluating
// (optional) check applied password policy
sudo chage -l <ユーザー名>
// hostname check
hostnamectl
// change user
su [username(sudo user)]
// change hostname
sudo hostnamectl set-hostname ->name<-
// apply change
sudo reboot
// partition check
lsblk
ここらでitermとかに切り替え、SSH接続するほうがいい。
sudo logのレビューのために。
//login with ssh
ssh name@127.0.0.1 -p 4242
// check sudo program
sudo --version
// assign to sudo
sudo usermod -aG sudo ->name-<
// check assign
id ->name<- -Gn
sudo
SuperUser Do。adminは何でもできてしまうので、意図せぬ操作でシステムを壊さないように、基本的にはadminは利用しない方がいい。
意図した時にadmin的な強い操作権を実行させるために「sudo」コマンドが実行できるユーザーを管理できる。
// check sudo setting
sudo visudo
// log file exist
su -
cd /var/log/sudo/
// check log
sudo less /var/log/sudo/sudo.log
// ^copy "TSID" from log. Use in next action
// Replay sudo actions
sudo sudoreplay -d /var/log/sudo "copied TSID"
UFW(Uncomplicated FireWall)
Linuxなら誰でも簡単に使えるFirewall機能。Firewallは外部からのアクセスを制御するための仕組み。悪意のあるアクセスを拒絶できる。UFWは、デフォルトではあらゆる外部からの通信を拒否し、許可する通信を定義する、というスタイル。
// check fw working and allowable port
sudo ufw status
// add port x
sudo ufw allow xxxx
sudo ufw status
// delete port
sudo ufw delete allow xxxx
sudu ufw status
// ssh working
sudo systemctl status ssh
// ssh setting
sudo nano /etc/ssh/sshd_config
SSH(Secure shell)
ネットワーク上の他のコンピューターに安全に接続するためのプロトコル(通信規約)。SSHは暗号化された通信チャンネルを提供するため、パスワードやその他の機密データを安全に送信することができる。
//login with ssh
ssh ->reviewername<-@127.0.0.1 -p 4242
ssh root@127.0.0.1 -p 4242
// check monitoring.sh
cd /usr/local/bin/
cat xxx
// check cron
sudo crontab -l
// edit cron
crontab -u root -e
cron
プログラムを指定して自動的に実行させる仕組み。
// stop cron
sudo systemctl stop cron
sudo systemctl disable cron
その他用語
サーバー
ネットワーク上で他のコンピューター(クライアント)に対してサービスを提供するコンピューターシステムまたはソフトウェアのこと。課題に落とし込むと、他のコンピューターにあなたのコンピューターからアクセスする仕組みを学ぼうぜ。そのために、他のコンピューター(サーバー)を作るところから始めてみようぜ、ってことかな。
sda5
sd:Small Computer System Interfaceディスクのこと。SCSIはインターフェース規格。Linuxはデバイスを名付けるときにSCSI規格っぽい名前をつけているが、物理的にはそのデバイスはSCSI規格ではない場合もある。
a:システム内の物理ドライブの順番。2つ目の物理ドライブがあれば、bとなる。
5:aドライブの5番目のパーティションを示している。
カーネル
LinuxOSの中核機能。メモリー、プロセス管理、ハードとプロセスの仲介役、プロセスからサービス要求の受け取りを行う。
apt/ aptitude/ apt-getコマンド
最も推奨されるコマンドはapt。aptitudeは派生版であり未完成、aptgetは設計上のミスがある。
IPv X(Internet protocol)
インターネットの規格の一つ。データをお届けする住所みたいなもの。
6は128ビットのアドレスを使用している。ほぼ無限の数のユニークなIPアドレスを提供できる。しかし現状、IPv4の利用の方が多い。
4は32ビットのアドレスを使用している。しかし利用できるIPアドレスの数が制限されるのでインターネットの急速な成長に対応できなくなっている。
リダイレクト
この課題に特化すると、ホストPCのリクエストをゲストPCに送ったりすることができるようになる機能。例えば、ホストマシン上でポート4242への接続をリダイレクトする設定を行った場合、ホストマシン上で行われるポート4242への全てのネットワーク接続要求(SSHのような)は、仮想マシンの同じポート(または指定された別のポート)に自動的に転送されます。
操作とその意味
ログイン(のようなもの)
>>please unlock disk sda5_crypt
sda5にアクセスしようとしているが、暗号化されているから暗証番号が必要。
>lsblk
デバイスとパーティションの情報を表示するコマンド。
ドライブ名、ID(MAJ :MIN)、マウントポイント(ディレクトリ名称)などが出る。マウントポイントが空欄のものはマウントされてないのでマウントするには設定が必要。
スーパーユーザーを登録する
>su -
ルートユーザーとしてログインし直す。かつホームディレクトリや環境変数が初期化される(さっきまでいたフォルダから抜ける)。ルートユーザーとしてのパスワード入力画面が出る。
root >apt update -y
利用可能なパッケージの最新リストを取得して、ローカルのパッケージデータベースを更新する。つまり、これからインストールするものが最新版になるように準備している。
root >apt upgrade -y
すでにインストールされているパッケージを最新の状態に更新する。(初めてのインストールならなくてもいい)
root >apt install sudo
update, upgradeで依存関係が最新版になったsudoがインストールされる。
root >usermod -aG sudo username
既存ユーザーのアカウントを変更する。-aGで副グループへの追加、続くsudoが追加先のグループを意味する。
(なおsudo visudoから設定する方法もあるが、得られる結果は同じなので説明は省略する)
>getent group sudo
確認コマンド。指定したデータベースからユーザーやグループの一覧が取得できる。groupがデータベースにあたり、sudoはキー(さらなる絞り込み)になる。
>apt-get install git -y
sudoのinstallと日を跨ぐ場合は、update, upgradeもお忘れなく。
何のためにインストールしたの?
以下の4コマンドは実行しなくてもいい。vimが必要になったらホストOSからSSH接続すればいいから。
>sudo apt-get install wget
>sudo apt-get install vim
>sudo apt-get install zsh
>sh -c "$(wget https://raw.github.com/ohmyzsh/ohomyzsh/master/tools/install.sh -O -)"
SSHサーバーのダウンロード
>sudo apt install openssh-server
sshはDLしないと利用できないので落としてくる。
>sudo systemctl status ssh
SSHサービスが稼働中であること、また問題が発生していないことを確認している。
>service ssh restart
リスタートは設定の書き換えなどを行った後に必要
SSHで利用するポートの変更
>sudo grep Port /etc/ssh/sshd_config
sshポートの変更前の状態を確認
>sudo nano /etc/ssh/sshd_config
Port 22 -> Port 4242
ポートの入れ替え。通常利用される22を利用しないことで、セキュリティリスクを低減している。
ついでなのでルートログインもさせないために
PermitRootLogin XX -> PermitRootLogin no
に書き換えておこう。
nanoは、Ctrl + o(オー) -> Enter ->Ctrl + xで書き込みFixできるはず。なお、SSHから直でルートログインができないだけで、一般ユーザーでSSH接続した後にルートにログインすることはできる。
>sudo grep Port /etc/ssh/sshd_config
ポート変更結果の再確認。
>sudo service ssh restart
ポートを変更の設定ファイルを適用させるためにリスタート
FireWallのインストールと設定
>apt-get install ufw
Uncomplicated Firewallをインストールする。
>sudo ufw enable
ufwを有効化するコマンド。システム起動時に自動的に起動するようになる。
>sudo ufw status numbered
現在設定されているUFWのルールを表示する。3行後の状態と比較するためにスクショしておくと良い。
>sudo ufw allow ssh
SSH接続を許可するよ、というルールの追加。デフォルトは許可していないのかな。
>sudo ufw allow 4242
ポート4242からの接続を許可するよ、というルールの追加。
>sudo ufw status numbered
多分22と4242が2個ずつあるはず。これはIPv4/6(ディフェンス参照)それぞれのもの。
>sudo ufw delete n
nは直前の表示で左端に示された番号のうち、削除したいSSH接続ポートを選ぶ。Toが22のものは2つあると思うので、それぞれ削除する(一気に削除できるかは知らない)。
>sudo ufw status numbered
To22がなくなり、To4242が2つあればおっけ。
SSH接続が外部からできるかの確認
Go to VirtualBox-> Choose the VM->Select Settings
Choose “Network”-> “Adapter 1"->”Advanced”->”Port Forwarding”
ホストOS(メインOS)の特定のポートへの接続をゲストOS(仮想マシン)の特定のポートにリダイレクトする機能。
>sudo systemctl restart ssh
sshを再起動している。VirtualBoxでポート設定を変更したから新しい設定を有効にしている(のだと思う)。
>sudo service sshd status
SSHサーバーが起動しているかを確認している。
ホストマシンのShellから操作する
>ssh your_username@127.0.0.1 -p 4242
*ssh_exchange_identification: read: Connection reset by peer: エラーメッセージ。仮想マシンでSSHなどをリスタートしたら出なくなった。
*The authenticity of host '[xxx]:xx ([xxx]:xxx)' can't be established. ECDSA key fingerprint is SHAxx:xx~. Are you sure you want to continue connecting (yes/no)?: yes でおっけ
*Warning: Permanently added '[127.0.0.1]:4242' (ECDSA) to the list of known hosts. Connection closed by xxx port 4242 : もう一回「ssh your_username@127.0.0.1 -p 4242」を実行
password入力の画面が出るので、ゲストで作成したユーザーのPWを入力する。
>exit
ホストからゲストへのSSH接続を解除する。ちなみに以降の作業はホストOSでやるのがおすすめです。コピペもできる。
パスワードルールの設定
>sudo apt install libpam-pwquality
パスワードルールを設定するためのライブラリをインストールする。
>sudo nano /etc/pam.d/common-password
設定ファイルを開く。
-> password requisite pam_pwquality.so retry=3の行を探し、
以下を追記する(サブジェクトが細かく変わるので注意)
minlen=10 lcredit=-1 ucredit=-1 dcredit=-1 maxrepeat=3 usercheck=1 difok=7 enforce_for_root
>sudo nano /etc/login.defs
パスワード有効期限の設定ファイルを開く
->以下の部分を書き換える(提示しているのは書き換え後の状態)
PASS_MAX_DAYS 30
PASS_MIN_DAYS 2
PASS_WARN_AGE 7
以下のコマンドは、パスワードの期限ルールを既存のユーザーにも適用するためのもの。必ず実行しましょう。
>sudo chage -m 2 -M 30 -W 7 your_username
>sudo chage -m 2 -M 30 -W 7 root
>sudo reboot
ユーザーグループの追加とグループへのユーザー追加
>sudo groupadd user42
ユーザーグループの追加
>getent group user42
ユーザーグループが増えたことを確認
>sudo usermod -aG user42 your_username
グループへのユーザー追加
>getent group user42
グループへユーザーが追加されたことを確認
SUDO実行時の制御
sudoは無闇に実行されたら困る。
なので、パスワード入力を間違え続けるとエラ〜メッセージを出したり、実行できるコマンドを制限したり、実行したコマンドをLogに残すという設定をする。
>sudo visudo
->
Defaults secure_path="Sudoで実行できるコマンドの元"(デフォルトで基本おっけ)
Defaults passwd_tries=3
Defaults badpass_message="Password is wrong!!"
Defaults logfile="/var/log/sudo/sudo.log"
Defaults iolog_dir="/var/log/sudo"
Defaults log_input
Defaults log_output
Defaults requiretty
システム監視ログの定期的な出力
ログインしている(多分TTYのみ)全てのユーザーにカスタマイズしたメッセージを表示するためのセクション。
->以下ルールをファイルに書き込む(下線は参考リンクがある)
#!/bin/bash
wall $'#Architecture: ' `uname -a`
$'\n#CPU physical: '`cat /proc/cpuinfo | grep "physical id" | wc -l`
$'\n#vCPU: '`cat /proc/cpuinfo | grep "processor" | wc -l`
$'\n'`free -m | awk 'NR==2{printf "#Memory Usage: %s/%sMB (%.2f%%)", $3,$2,$3*100/$2 }'`
$'\n'`df -BM -T --total | grep "total" | awk '{printf "#Disk Usage: %d/%dMB (%s)", $4, $3, $6}'`
$'\n'`top -bn1 | grep "load" | awk '{printf "#CPU Load: %.2f\n", $(NF-2)}'`
$'\n#Last boot: ' `who -b | awk '{print $3" "$4" "$5}'`
$'\n#LVM use: ' `lsblk |grep "lvm" | awk '{if ($1) {print "yes";exit;} else {print "no"} }'`
$'\n#Connection TCP:' `netstat -an | grep "ESTABLISHED" | wc -l`
$'\n#User log: ' `who | cut -d " " -f 1 | sort -u | wc -l`
cutコマンドを使用してテキストデータを処理します。
-d " "オプションにより、スペース(半角スペース)をデリミタとして指定します。つまり、各行をスペースで区切ります。
-f 1オプションにより、1番目のフィールド(最初の列)を抽出します。
$'\n#Network: IP ' `hostname -I`"("`ip a | grep "link/ether" | awk '{print $2}'`")"
hostname -Iコマンドは、ホストのIPアドレスを取得します。
awk '{print $1}'は、IPアドレスの最初のフィールド(スペースで区切られた最初の文字列)を抽出します。
echoコマンドは、括弧で囲まれた部分をそのまま出力します。
ip a | awk '/link\/ether/ {print $2}'は、ip aコマンドの出力を処理し、MACアドレスを抽出します。
最終的な結果は、ホストのIPアドレスの後にMACアドレスが括弧で表示される形式になります。
最終的な結果は、ホストのIPアドレスの後にMACアドレスが括弧で表示される形式になります。
$'\n#Sudo: ' `grep -a "COMMAND" /var/log/sudo/sudo.log | wc -l` 'cmd'
*設定したのに実行されない(bashで強制的に実行はできる)というときは、ファイルの権限を見直すと良いです。