ホーム » コンピュータ (ページ 35)
「コンピュータ」カテゴリーアーカイブ
HomeKit/homebridgeをラズパイで再開
一時期、google home notifier のインストールで削除した Siri を使うための HomeKit 互換の homebridge を raspberry-pi の上に再インストールを行った。
Google Home Mini を喋らせるためにインストールした google home notifier では、node.js を使うため(あとで問題がないと分かったけど)に、一旦機能を止めていたけど、機能の競合の起こりにくい raspberry-pi に暇つぶしも兼ねて homebridge を入れる。
インストールにあたり、赤外線リモコンの制御の python-broadlink を raspberry-pi にインストールしたので、単独でテレビのON/OFF/ビデオ入力切替の cec もあるから、サーバを活用しなくても済む。
手順は、過去の自分のインストールメモを参考。ちょっと手間取ったけど。
ということで、
- テレビ,チューナー,PS4のON/OFF
- 2つの照明のON/OFF
- 室内/室外の温度計の表示
が、Hey, Siri で可能。
geoipdeny より kr, tw, hk を削除
最近、自宅よりアクセスできないサイトがあるみたい。特に日本のページのはずだけど、WiFi を切って携帯キャリア接続にすると、問題なく見える。あるとすれば、自宅のファイアウォールの問題か。
自宅では、IPアドレスの国ドメイン割り振り情報を元に、特定の国の IP アドレスをフィルタで接続を拒否している。対象国は自宅サーバへのアクセス履歴で私に縁の無い国から選んだ。でも、最近ではネットワーク接続的に近隣の国のサーバを経由している場合もある。そうなってくると、韓国kr、台湾tw、香港hk の制限が問題になっている可能性が高い。
ということで、これらの国を削除してフィルタを作り直し。
MacBookAir(2011年購入)にUbuntu18を入れる
随分前に購入してSSD入れ替えやバッテリー入れ替えをして愛用機ではあったが、最近は全然使っていなかった 2011年購入のMacBookAir だけど、知り合いが Ubuntu 入れてた記事があったので、自分も入れてみた。MacOS だと、1つの Apple のアカウントに紐付けされている PC が多くて、バックアップのメモリが足りないとか警告が来るし。
インストールは、書いてある通りに進めればいいけど、インストールするためのUSBをGPT(GUID Partition Table)でフォーマットするのに一手間。最近の MacOS では、GPT でのフォーマット機能は隠してあるみたい。やむなくコマンドラインにて作業。
$ diskutil eraseDisk FAT32 SECDISK GPT /dev/disk3 # FAT32形式、ボリュームラベル=SECDISK、GPTでフォーマット
あとは、Etcher とかいう、GPT などにも対応した Image 書き込みソフトで、ブート USB を作って、option キーを押しながら boot させ、EFI のブートメニューから Ubuntu を選ぶ。
日本語のキーボード周りの設定がちょっと面倒だけど、簡単 Linux 環境のできあがり。
WordPress多要素認証をTwo Factorに変更
WordPress は広く普及しているCMSソフトだからこそ、いい加減な設定だと乗っ取り被害も多く、パスワードの管理は極めて重要。
miniOrange
その中で、今までは miniOrange 社の 2段階認証プラグインを使っていた。機能も多く便利だったけど、便利な認証が有償機能になり、一般的な”Google Authenticator”のような有効時間付きPIN番号の認証機能を使っていた。
他にも様々な2段階認証の方法が使えるけど、その認証は有償だし、他の認証プラグインを探す。
Google Authenticator
改めて探すと、Google Authenticator という名前の認証プラグインが見つかった。名前通りの”Google Authenticator”対応。でも個人の作者の作品みたい。
上記の Google Authenticator は、認証が”Google Authenticator”とバックアップコードだけど、バックアップコードはメモしておくのが面倒なんだよな。
Two Factor
ということで、さらに探してみたら”Two Factor”というプラグインがある。
作者も Plugins Contribution という団体?だし、多要素認証もメールへの認証コード送信、認証アプリ、FIDO認証キー、バックアップコードと基本的な機能を網羅している。ということで、これを入れて登録。
ネットワーク攻撃の目的
ブラックハッカーがインターネットで攻撃する目的は何か?
愉快犯・自己主張
ハッカーが攻撃を行う理由は、古くは愉快犯だったり自己顕示欲といった理由であった。
- 愉快犯 – システムが動かずに混乱している様を楽しむ
- DoS 攻撃(Denial of Service: サーバが仕事ができないようにする攻撃)
- システムのデータベースを破壊する
- 自己主張
- 自己顕示欲 – すげーことしたという満足感
- 政治的主張 – 堂々とできない批判を行う
- 別の攻撃の地盤づくり – 地盤を作る目的は…次の「金」を参照
- ウィルス/マルウェアの拡散
- 他の攻撃のための踏み台
- ボットネットの構築
金、カネ、Money…
しかし最近は、お金が目標。
- 宣伝 – アダルトサイトの宣伝による広告収入目的
- Webサイトに、不正な広告へのリンクを書き込む
- 不正な広告を行う迷惑メールを大量送信
- 脅す – XXされたくなかったら金を送れ。
- DoS 攻撃でシステムを止めるぞ!
- 奪ったデータを公開するぞ!
- 重要データを暗号化した。元に戻したかったら金を送れ!(ランサムウェア)
- 盗む
- 軍事機密、機密研究の情報を盗む。
- ネットバンクで不正送金、クレジットカード情報で買い物、仮想通貨で盗む
ファイル操作・リダイレクト・LOG解析
ファイル操作やリダイレクトといったLinuxでのファイルの基本操作については、講義用資料を参照。 実際の操作演習に使うファイルを、Raspberry-Pi によるサーバに入れてある。そのファイルで腕試しをしてね。
- 第1回Linux演習(1/21)
- 第2回Linux演習(1/28)
ファイアウォールとiptables
インターネットからの攻撃を防ぐには、ファイアウォールが必要となる。外部からの接続をうけるコンピュータは、ファイアウォールがどう設定されているのか把握することが重要。
ファイアウォールとDMZ
ファイアウォールは、パケットの(送信元IPアドレス,送信元ポート番号)、(宛先IPアドレス,宛先ポート番号)を見て、通信を制限するルータであり、専用のファイアウォールではさらに細かい制限を加えたり、通信履歴を保存することができる。
組織向けの外部公開のWebサーバやメールサーバを持つ組織では、外部からの接続をうける必要があり、脆弱性があればサーバは乗っ取りなどの被害に会いやすい。サーバが被害を受けたらファイアウォール内部のコンピュータに被害が広がる(トロイの木馬)のは危険であることから、(1) DMZ(非武装地帯)内部に外部公開のサーバを置き、(2) 対外FireWallで外部からのパケットはすべてDMZだけに通す。(3) 内部FireWall では、DMZ の特定の受信パケットだけ流す様にする。
DMZ内部のサーバは、外部からの攻撃をうけるため、極めて慎重にセキュリティ対策を行う必要がある。
iptables
Linux で FireWall を構築するときには、iptables を用いる。iptables では、主に以下の3つのルール(チェイン)でパケットを制限できる。
- コンピュータに入ってくるパケットに対するルール(INPUT チェイン)、
- コンピュータから出ていくパケットに対するルール(OUTPUTチェイン)、
- コンピュータで中継するパケットに対するルール(FORWARDチェイン)
iptables の設定を見るには、iptables -L を実行する。
$ sudo iptables -L # すべてのルールを表示 Chain INPUT (policy DROP) target prot opt source destination DROP all -- anywhere anywhere state INVALID ACCEPT all -- 192.168.11.0/24 anywhere ACCEPT tcp -- anywhere anywhere tcp dpt:http ACCEPT tcp -- anywhere anywhere tcp dpt:https : Chain FORWARD (policy DROP) target prot opt source destination DROP all -- anywhere anywhere state INVALID ACCEPT all -- 127.0.0.0/8 anywhere ACCEPT all -- 192.168.11.0/24 anywhere Chain OUTPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
iptables で制限のための設定を間違えると、通信ができなくなるので、基本的な考え方だけを紹介する。
「条件にマッチしたパケットをどうするのか」というルールを、チェインに並べておき、パケットが届くとチェインの先頭からルールを適用し、ACCEPT/REJECT/DROPなどの対応を決める。
iptables でルールを登録する場合は、一般的に以下の書式で、条件1,条件2… をすべて満たすパケットをどうするのかのラベルを最後に記載する。
$ iptables -A チェイン 条件1 条件2 … -j ラベル
$ iptables -P INPUT DROP # デフォルトポリシーの設定 # INPUT のルールにどれもマッチしない場合はDROP(パケット廃棄) $ iptables -P OUTPUT ACCEPT # OUTPUT のどのルールにもマッチしなければACCEPT(受信許可) $ iptables -A INPUT -s 127.0.0.1 -j ACCEPT # INPUT の末尾に、"送信元IPが 127.0.0.1 ならACCEPT" を追加 $ iptables -A INPUT --dport 80 -j ACCEPT # INPUT の末尾に、"宛先ポートが 80 ならACCEPT" を追加 $ iptables -A INPUT -s 11.22.33.44 -j DROP # INPUT の末尾に、"送信元IPが 11.22.33.44 ならDROP" を追加 iptablesのオプション引数 -P デフォルトポリシーの設定 -A 末尾にルールを追加 -s 送信元IPアドレスの条件指定 -d 宛先IPアドレスの条件指定 --sport 送信元ポート番号の条件指定 --dport 宛先ポート番号の条件指定 -j 指定ラベルに移動 INPUT chain | <送信元IPが127.0.0.1なら>----ACCEPT | <宛先ポートが80なら>----------ACCEPT | <送信元IPが11.22.33.44なら>--DROP | DROP
ユーザとリモート処理
Linux ではユーザを切替えながら処理を実行したり、ネットワークを越えて命令を実行することができる。外部から攻撃を受けてバックドアが仕掛けられていて不正侵入をうけているのか確認する時に、どういったユーザの処理を実行しているのか把握し、リモート接続で処理ができるような状態なのか知ることが重要。
ユーザとユーザの切り替え
ユーザ,グループの管理
unix では、ユーザ情報は /etc/passwd , /etc/group で管理している。passwdファイル先頭の、ユーザ番号 0 は、なんでもできる権限を持つシステム管理者 root となっている。ユーザ番号 1~999 は、システムを動かすための特殊なユーザとなっている。1000以上は、実際のユーザに割り当てることが多い。
((( /etc/passwd ))) root:x:0:0:root:/root:/bin/bash sshd:x:111:65534::/var/run/sshd:/usr/sbin/nologin tsaitoh:x:1000:1000:Tohru Saitoh,,,:/home/tsaitoh:/bin/zsh | tsaitoh = ユーザ名 | x = 昔はパスワードが書いてあった, *ならアカウントロック | 1000 = ユーザ番号 | 1000 = グループ番号 | Tohru Saitoh,,, = ユーザの名前など | /home/tsaitoh = ホームディレクトリ | /bin/zsh = シェル ((( /etc/group ))) root:x:0: ssh:x:112: home:x:1000:tsaitoh | home = グループ名 | x = 昔はパスワードが書いてあった, *ならアカウントロック | 1000 = グループ番号 | tsaitoh = グループに所属するユーザ名(コンマ区切り)
ただし、/etc/passwd, /etc/group は、全ユーザが読めるファイルで、暗号化されたパスワードを覚えるには不向きなので、/etc/shadow , /etc/gshadow に保存されている。
ユーザの確認
自分の情報を確認するには、whoami , id , finger コマンドを用いる。
$ whoami # ユーザ名を表示 tsaitoh $ id # UIDやGIDなどの情報を表示 uid=1000(tsaitoh) gid=1000(home) .... $ finger # ユーザの詳しい情報を表示 Login Name Tty Idle Login Time Office Office Phone tsaitoh Tohru Saitoh pts/0 Feb 17 22:47 (192.168.11.xx) 12-3456
su コマンド
ユーザを切り替えるには、su コマンドを用いる(Set User)。別ユーザで命令を実行することもできる。ただし、その別ユーザのパスワードが必要。
$ su root Password: ●●●●●●●● # exit $ su -c whoami root Password: ●●●●●●●● root
システム管理者での作業は、危険な命令も実行できる状態なので、作業ミスを減らすためにプロンプトが、# に切り替わる。
ただし、su コマンドは、切り替えるユーザのパスワードが必要である。システム管理作業を複数人で行う場合、管理者パスワードを複数人に教えることになり、セキュリティ的に危険である。
sudo コマンド
そこで、管理者などに登録した人であれば、自分のパスワードで管理者権限を得ることができる sudo (set user do) コマンドを使うのが一般的である。
$ sudo bash Password: ●●●●●●●● 自分のパスワード # exit $ sudo whoami # 管理者で whoami を実行 root $ sudo -u foobar # ユーザ foobar に変更 $ whoami foobar $ exit $ whoami tsaitoh
システム管理者になれるユーザの設定は、/etc/sudoers に記載されている。一般的に、sudo グループに所属していれば、管理者になれるように設定されていることが多い。
su id bit / スティッキービット
パスワードを変更するpasswdコマンドでは自分のパスワードを変更でき、/etc/passwd や /etc/shadow が書き換えられる。unixのr,w,xの権限だけの知識だと、通常ユーザ自身がpasswd,shadowファイルを書き換えられるのなら、同じファイルに記録されている他のユーザ情報(特にパスワードを変更できるはずである。であれば、他人のパスワードも変更できてしまうのではないのか? 当然、こんなことはできてはいけない。
実は、一時的に他のユーザ権限を借りて作業をするため(システム管理者の権限を借りて作業するため)に、su id bit (スティッキービット)という属性がある。
$ sudo bash $ passwd Password: ●●●●●●● Re enter Password: ●●●●●●● $ which passwd /usr/bin/passwd ls -al /bin/ls -rwxr-xr-x 1 root root 138856 8月 7 2019 /bin/ls $ ls -al /bin/passwd -rwsr-xr-x 1 root root 63960 2月 7 23:54 /usr/bin/passwd
上記の passwd コマンドでは、ファイル属性が – rws r-x r-x となっている。(通常の ls コマンドでは、– rwx r-x r-x となっている。)
su id bit が ON になっているコマンドは、一時的に そのファイル所有者 (/usr/bin/passwd の所有者は root) の権限を借りて命令を実行できる。
ただし、スティッキービットが ON だと、管理者権限で命令を実行することができるが、そのコマンドに不備(脆弱性)があると、システムを乗っ取るためにクラッカーが悪用する場合がある。
((( suid ビットが ON のファイルを探す ))) $ find /usr/bin -perl /u=s -print /usr/bin/password
リモート作業
ネットワークを越えて命令を実行するには、telnet や rsh や ssh コマンドを使う。telnet や rsh コマンドは、通信内容が暗号化されていないため、パケットキャプチャを使われると、パスワードなどを盗むこともできるため、通常は使ってはならない。
telnet (暗号化なしのリモート接続)
$ telnet remote-host # remote-host という名前のコンピュータに telnet で接続 login: ユーザ名 password: パスワード $ exit
ssh (暗号化されたリモート接続)
ssh は、通信内容を暗号化して安全にリモートコンピュータで命令を実行するコマンド。リモートコンピュータへの接続(slogin)、リモートコンピュータで命令の実行(ssh)、リモートコンピュータとのファイル転送(scp) などができる。
$ slogin remote-host # 別コンピュータにlogin Password: ●●●●●●●● $ hostname # 使っているコンピュータ名を調べるコマンド remote-host $ exit $ slogin foobar@remote-host # 指定したユーザ名(foobar)で接続 Password: foobarのパスワード $ whoami foobar $ exit $ ssh remote-host ls # remote-host 上で ls を実行 Maildir $ ssh foobar@remote-host whoami foobar $ scp test.c remote-host:~ # ファイル test.c を remote-host のホームディレクトリにコピー(アップロード) $ scp foobar@remote-host:hoge.txt dest-dir # リモートホストの hoge.txt を、dest-dir にコピー(ダウンロード)
ネットワークサービスとポートスキャン
外部からネットワーク接続を受けて、どういった処理を実行するようになっているのかを知るための方法を説明する。
ポート番号
ネットワーク通信では、通信する相手を指定するために IP アドレスが用いられるが、サーバでは、複数のプログラムが動いており、どのプログラムと接続するのかを指定するには、ポート番号を用いる。
IPアドレスを電話番号に例えるならば、ポート番号は内線電話番号に相当する。
特に、サーバではクライアントからの通信を待つために、このサービスならばこのポート番号を使うという標準番号が決まっている。
SSH = 22 # リモート接続(暗号化) TELNET = 23 # リモート接続 SMTP = 25 # メール送信 DNS = 53 # DNSサービス HTTP = 80 # Web サーバ POP = 109,110 # メール受信 IMAP = 143 # メール受信 HTTPS = 443 # Web サービス(暗号化) SMTPS = 465 # メール送信(暗号化) IMAPS = 993 # メール受信(暗号化) POPS = 995 # メール受信(暗号化)
ネットワークサービス
サーバでは、クライアントからの接続の受信を待つために、あらかじめプログラムを起動しておく必要がある。
こういうサーバプログラムは、Linux の世界では デーモン と呼ぶことも多い。
ネットワークサービスを起動する方式には、いくつかの方法がある。
スーパーサーバを使う場合
ネットワーク処理のプログラムは、複雑な処理を行うためそのプログラムを起動しておくと、メモリを大量に使用する。古いコンピュータでは、処理速度の低下となるため、利用頻度の低いサーバは、汎用的なサーバを起動しておき、必要に応じてプログラムを起動する。この方法には、inetd とか xinetd が用いられる。
$ vi /etc/inetd.conf echo stream tcp nowait tsaitoh コマンド名
上記の例では、echo=7番ポート に tcp で接続すると、ユーザ名 tsaitoh の権限で、コマンド名を実行してくれる。
デーモンを起動しておく場合
Linux では ランレベル という状態が決められている。
- シングルユーザモード(S) – 管理者が作業中で他のネットワーク接続とかを受け付けない状態
- システム停止(0) – 他の状態からシステム停止に移るための仮想的なランレベル
- マルチユーザモード(2) – 複数のユーザの接続ができる状態
- GUI環境付きのマルチユーザモード(5) – X11ディスプレイマネージャが動く状態
((( /etc/inittab の中に以下の記載がある ))) $ cat /etc/inittab : # The default runlevel. id:2:initdefault: : $ runlevel # 現在のランレベルを確認する方法 N 5
sysv-rc 方式
Linux では、ランレベルを変更する init コマンド(init 0 を実行すると、システムを停止できる)を実行すると、
- /etc/rc移行元ランレベル.d 配下のKで始まるプログラムをファイル名順に実行する。
- /etc/rc移行先ランレベル.d 配下のSで始まるプログラムをファイル名順に実行する。
$ ls /etc/rc2.d K01aprx S17sudo K01onedrive S17unattended-upgrades README S17uuidd S01lvm2-lvmpolld S18acpid S01pulseaudio-enable-autospawn S18amavis S14nfs-common $ sudo /etc/init.d/apache2 start # apache2のサーバ起動 $ sudo /etc/init.d/apache2 stop # 停止 $ sudo /etc/init.d/apache2 restart # 再起動
systemd 方式
上記の sysv-rc 方式は、プログラムの起動スクリプトが shell で書かれているので、(システムが単純な頃は)メンテナンスが容易だったが、(システムが複雑になると)起動処理に時間がかかるのが問題となった。このため、新しい Linux では、systemd というプログラムでサーバを起動する方式にかわった。
$ ls /etc/systemd journald.conf network pstore.conf sleep.conf system.conf user logind.conf networkd.conf resolved.conf system timesyncd.conf user.conf $ sudo systemctl list-units # systemd のユニット一覧 $ sudo systemctl list-sockets # 使用中のソケット一覧 $ sudo systemctl status apache2 # systemd で起動している特定のサーバの状態確認 $ sudo systemctl start apache2 # systemd でサーバ起動 $ sudo systemctl stop apache2 # systemd でサーバ停止 $ sudo systemctl restart apache2 # systemd でサーバ再起動
起動中のプログラムの確認
システムが通常状態で起動しているプログラムを確認するには、ps ax を用いる。
$ ps ax # a 全プロセス表示 x 端末を持たないプロセスも表示
PID TTY STAT TIME COMMAND
1 ? Ss 2:57 /sbin/init
2 ? S 0:00 [kthreadd]
:
2229038 ? S 0:03 /usr/sbin/apache2 -k start
:
PIDがプロセス番号、STATは、S:処理待ち状態、R:実行状態、TIME欄は、のべ実行時間を表す。
各プロセスの親プロセスと子プロセスの関係が知りたい場合には、pstree コマンドを用いる。
$ pstree
systemd-+-/usr/sbin/amavi---2*[/usr/sbin/amavi]
|-/usr/sbin/apach---11*[/usr/sbin/apach]
|-ModemManager---2*[{ModemManager}]
|-NetworkManager---2*[{NetworkManager}]
ここで、見たことのないプログラムが動いている様なら、システムの進入を受けた可能性を疑わないといけない。
ネットワーク通信で受信待ちのプログラムの確認
Linuxで開いているポートを確認するためには、netstat コマンドを用いる。
$ sudo netstat -ltup4 # -l Listenポート、-t TCP、-u UDP、-p ポートを開いている、-4 IPv4 稼働中のインターネット接続 (サーバのみ) Proto 受信-Q 送信-Q 内部アドレス 外部アドレス 状態 PID/Program name tcp 0 0 localhost:3551 0.0.0.0:* LISTEN 841/apcupsd tcp 0 0 0.0.0.0:imaps 0.0.0.0:* LISTEN 418280/dovecot :
nmap でポートスキャン
netstat コマンドは、対象コンピュータを使っている時には有効だが、他のコンピュータを調べるには、ポートスキャン専用の nmap を使うのが一般的。
ポートスキャンとは、相手のコンピュータに接続するポート番号を変更しながら、通信可能か調べること。
$ sudo nmap localhost Starting Nmap 7.80 ( https://nmap.org ) at 2020-02-17 14:45 JST Nmap scan report for localhost (127.0.0.1) Host is up (0.0000090s latency). Other addresses for localhost (not scanned): ::1 Not shown: 982 closed ports PORT STATE SERVICE 22/tcp open ssh 25/tcp open smtp :
nmap で調べるための様々なオプション
$ sudo nmap -A localhost # OSなどを調べる $ sudo nmap -p 1-1023 localhost # 1〜1023 までのポート番号を調べる $ sudo nmap -sU localhost # UDPのポートスキャン $ sudo nmap -O localhost # OSの検出
攻撃を受けているのであれば、wireshark などのパケットキャプチャを使って、パケットの中身を調べる必要がある。






