不惑にしてまだ何者でもない者のブログ

Arduino関連、Raspberry Pi関連、プログラミング学習

LinuCレベル1取得に向け勉強中:第10章 セキュリティ

2020-10-14 22:51:11 | LinuC
LinuCレベル1合格教本で、勉強を進める。
いよいよ大詰め。
残すは、10章と11章だけであるが、11章は読み物だけだったので、先に読んでしまったので、また、後でまとめようと思う。
今回は、『第10章 セキュリティ』である。
難しそうだが、気になってた部分だな。😏 

 

10.1 セキュリティ管理業務の実施

10.1.1 SUID/SGIDが有効になっているファイルの検索

  • SUIDやSGIDビットが不要な実行ファイルに設定されていると、セキュリティ上の問題となる可能性がある。
  • SUIDビットの有効化
    • chmod u+s `which touch`
  • SUIDが有効になっている実行ファイルの検索
    • find /usr -perm -4000 -ls
  • SUIDビットの無効化
    • chmod u-s /bin/touch

10.1.2 shadowファイルの特徴とユーザー/パスワードの有効期限

  • shadowファイルは、passwdやgroupファイルと異なり、rootユーザーしか参照できない。
  • ユーザーアカウントやパスワードには有効期限を設定できる。
    • usermod -e 日付 アカウント名
      usermod -e 2020-10-15 test01
  • usermodコマンドのうち、アカウントの有効期限、無効化にかんするオプションの確認
    • usermod [オプション] ユーザー名:ユーザーの設定を変更
      -e 年−月−日:アカウントの有効期限を設定
      -L:アカウントをロック(無効化)
      -U:アカウントのロックを解除
  • パスワードの有効期限は、chageコマンドやpasswdコマンドで設定できる。
    • chage [オプション] ユーザー名:パスワードの有効期限情報を設定
      -l(エル):有効期限情報を表示
      -m 日数:パスワードを変更できる最短日数を設定
      -M 日数:パスワードの有効期限(使用できる最大日数)を設定
      -I(アイ) 日数:パスワードの有効期限が切れてからアカウントを無効化するまでの日数を設定
      -W 日数:パスワードの有効期限切れの警告が何日前から表示されるか設定
      -E 年-月-日:アカウントの有効期限を設定
      ※ オプションなしの場合、対話式で設定
    • passwd オプション ユーザー名:パスワードに関する情報を設定
      -x 日数:パスワードの有効期限を設定
      -l:アカウントをロック(無効化)
      -u:アカウントのロックを解除
      -e:パスワードを有効期限切れにする
  • ログインシェルを以下のものにすると、bashなどの通常シェルを開くことができず、通常の対話式シェルができなくなる。
    • /bin/false
    • /sbin/nologin
  • 以下のように/etc/nologinファイルを作成すると、一般ユーザーによるログインをすべて禁止できる。
    • touch /etc/nologin

10.1.3 ユーザー環境の切り替え

  • su [オプション] [ユーザー名]:ユーザー環境の入れ替え
    -:カレントディレクトリや設定されている変数など、ユーザー環境を切り替える
  • sudo [オプション] コマンド:別のユーザー権限でコマンドを実行
    -u ユーザー名:指定したユーザー権限でコマンドを実行(指定しなかった場合はrootユーザー権限でコマンドを実行)
    • sudoコマンドを利用するには、/etc/sudoersファイルにsudoコマンドを実行できるユーザーと実行できる操作を設定しておく必要がある。
    • sudoersファイルの編集は、visudoコマンドで行う。
  • visudo [オプション]:sudoersファイルを編集し、sudoコマンドの実行設定を行う。

10.1.4 ファイルやポートを開いているプロセスの確認

  • lsof [オプション] [ファイル]:ファイルやポートを開いているプロセスを表示
    -i:ポート番号:指定したポートを開いているプロセスを表示
  • fuser [オプション] [ファイル]:ファイルやポートを開いているプロセスを表示
  • nmap [オプション] ホスト:指定したホストが待機しているポートを確認(ポートスキャンを実行)

10.1.5 使用するリソースの制限

  • ulimit オプション:利用できるリソース量を制限
    -a:対象となるリソースと制限値の一覧を表示
    -c ブロックサイズ:コアダンプファイルのサイズを制限
    -n ファイル数:同時に開くことができるファイル数を制限

10.1.6 ユーザーのログイン情報の調査

  • who [オプション]:現在ログイン中のユーザーと端末の情報を表示
  • w [オプション]:現在ログイン中のユーザーと端末、実行しているプロセスの情報を表示
  • last [オプション]:ホスト上でのログイン履歴
  • これらの情報の元になっているのは、/var/run/utmpファイル、/var/log/wtmpファイル(表10.1)
    →これらはバイナリファイル

表10.1 whoコマンド、wコマンド、lastコマンドが参照するファイル
ファイル
参照するコマンド
/var/run/utmpwho, w
/var/log/wtmplast

10.1.7 自動ログアウト

  • TMOUT変数を利用すると、一定時間操作がされていない場合に自動ログアウトするように設定できる。
    • export TMOUT=60

10.2 ホストのセキュリティ設定

10.2.1 不要なネットワークサービスの停止

  • sytemdを使用した方法
    • 停止:systemctl stop httpd
    • 無効化:systemctl diable httpd
    • 確認:systemctl status httpd
  • systemdが導入される前の環境では、initがプロセスの自動実行を管理しているため、以下の構文でサービスを停止することができる。
    • 無効化:chkconfig httpd off
    • 停止:service httpd stop
    • 確認:service httpd status
  • chkconfig [サービス名] [on/off]:init環境における指定したサービスの自動起動の有効化/無効化
  • service サービス名 操作:init環境における指定したサービスの制御
    • serviceコマンドは、/etc/init.d/ディレクトリに格納されているスクリプトを動作させるコマンド

10.2.2 スーパーサーバーの利用

  • スタンドアロンサーバー:サーバーアプリケーションを常駐させる場合に個々のサーバープロセスが起動する手法。
  • スーパーサーバー:以前は、すべてのサーバーを個々に常駐させず、inetd, xinetdといったスーパーサーバーを常駐させ、あるポートにユーザーが接続してきたら対応するアプリケーションを起動するという手法が取られていた。
  • inetdの設定ファイルは、/etc/inetd.conf
    • もし、inetd経由で不要なサービスが起動するようになっていた場合、以下のように該当箇所をコメントにすることでサービスを停止する。
      vi /etc/inetd.conf
      system restart inetd
  • Linuxホストにリモート接続してシェルを起動するコマンドとして、以前はtelnetを使用していた。
    • telnetは既定で通信経路の暗号化を行わないなど、SSHのほうがセキュリティ的にも優れている。
    • 何らかの理由でtelnetサーバーを有効にしたい場合は、歴史的な経緯からxinetd経由で管理を行うことがある。
表10.2 xinetdで利用する設定ファイル
ファイル
内容
/etc/xinetd.confxinetd全般の設定
/etc/xinetd.d/ディレクトリ内のファイルxinetdで管理するプログラムの設定

表10.3 xinetdの設定ファイルで設定できる内容
設定項目
説明
diablexinetd経由での接続の有効/無効化(noで有効化)
only_fromxinetd経由での接続を許可するホスト/ネットワーク
no_accessxinetd経由での接続を拒否するホスト/ネットワーク

telnetのインストール
  • Debian:
    apt-get install telnetd
  • CentOS:
    yum -y install xinetd
    cat /etc/xinetd.d/telnet // 確認
    systemctl start xinetd
    lsof -i:23 // 確認
  • telnet ホスト [ポート番号]:telnetサーバーもしくは指定したポート宛に接続

10.2.3 firewalldによるパケットフィルタリング

  • LinuxカーネルにはNetfilterというカーネルモジュールが用意されており、パケットフィルタリングやアドレス変換を実現する。
    • その設定のためのユーティリティとして、firewalldやiptablesが用意されている。
  • パケットフィルタリング:パケットに対して、サービスやポート番号などによる許可/拒否のルール設定を行い、ルールに従ったパケットの送受信を行うことで想定外の送受信が成立しないように構成する仕組みのことである。
  • firewall-cmd オプション:firewalldを介してNetfilterの制御
    • 主なオプション
      --get-default-zone:デフォルトゾーンの表示
      --set-default-zone=ゾーン:デフォルトゾーンの設定
      --zone=ゾーン:制御対象とするゾーンの指定
      --add-service=サービス:指定したサービスを許可対象に追加
      --remove-service=サービス:指定したサービスを許可対象から削除
      --add-interface=インターフェイス:インターフェイスをゾーンに追加
      --remove-interface=インターフェイス:インターフェイスをゾーンから削除
      --list-all-zones:すべてのゾーンの情報を表示
      --list-all:ゾーンの情報をすべて表示
      --list-services:許可対象となっているサービスを表示
      --list-interfaces:ソーンに含まれるインターフェイスを表示
      --permanent:永続的な設定にする(設定ファイルに書き込む)
    • 主なゾーン
      public:パブリックエリア用(デフォルト)
      dmz:DMZネットワーク用
      trusted:すべての接続を許可
      drop:すべての接続を拒否
  • iptables オプション:Netfilterの制御(firewalld以前)
    • 主なオプション
      -L [チェイン]:ルールの表示
      -A [チェイン] ルール:ルールを末尾に追加
      -D [チェイン] ルール:ルールの削除
      -P チェイン ターゲット:チェインに対して、ポリシー設定を行う
    • 主なターゲット
      ACCEPT:パケットを許可
      DROP:パケットを破棄

10.3 暗号化によるデータの保護

10.3.1 暗号化技術の概要

  • 暗号方式と使用する鍵の違い
    • 共通鍵暗号方式:
      • 暗号化と復号を同じ鍵で行う
      • 何らかの形で、事前に鍵を共有する必要がある
      • 公開鍵暗号方式に比べて処理が早い
    • 公開鍵暗号方式:
      • 暗号化と復号で異なる鍵を使う。
        暗号化:受信者の公開鍵、復号:受信者の秘密鍵
      • 事前に鍵を共有する必要がない
      • 共通鍵暗号方式に比べて処理に時間がかかる
    • 共通鍵暗号方式に分類されるアルゴリズムに、DESやAESがある。
      • DESは1976年にNIST(米国標準技術研究所)によりFIPS(公式連邦情報処理標準)として採用されたが、現在ではアルゴリズムに脆弱性が発見されており、その位置をAESに取って変わられた。
      • AESは、2000年にFIPSとして採用されたアルゴリズムであり、無線LAN通信の暗号化などで現在も利用されている。
    • 公開鍵暗号方式に分類されるアルゴリズムに、RSAがある。
      • RSAは、発明者であるRon Rivest, Adi Shamir, Leonard Adelmannの頭文字から名前が付けられたアルゴリズムで、大きな数の素因数分解が困難であることを利用して暗号化処理を行う。

10.3.2 OpanSSH

  • SSHにおける認証の流れ
    • ① ホスト認証:接続先のサーバーを認証
    • ② ユーザー認証:接続元のユーザーを認証
      • ②-1 公開鍵認証
      • ②-2 パスワード認証
  • ssh [オプション] [ユーザー@]ホスト [コマンド]:sshにリモート接続を行う。
    -L:ポート転送を行う
    -A:ssh-agentによる鍵転送を行う
    -l ユーザー:ユーザー名を指定
    -i:秘密鍵ファイルを指定

10.3.3 ユーザー認証における公開鍵の利用

  • ユーザー認証における公開鍵の利用の流れ
    • ① ssh-keygenコマンドで生成
    • ② ~/.ssh/authorized_keysに登録
    • ③ SSH接続時、接続先の公開鍵と接続元の秘密鍵により認証
  • ssh-keygen [オプション]:SSH接続で利用する公開鍵ペアを生成する
    -t アルゴリズム:公開鍵ペアを生成する際に利用するアルゴリズムを指定。rsa(デフォルト)、dsa、ecdsaもしくはed25519を指定できる。
    -s ビット数:生成する鍵のビット数を指定
    -a ラウンド数:ed25519で鍵を生成する際のKDFラウンド数を指定
    -C "コメント":鍵データに付属するコメントを指定

表10.4 ssh-keygenコマンドで指定できる暗号化アルゴリズムと鍵のビット数
鍵の種類(アルゴリズム)
説明
ビット数
RSA大きな数の素因数分解の困難さを利用したアルゴリズム1024
2048(デフォルト)
4096
dsa1993年にNISTによりFIPSとして採用されたアルゴリズムで、離散対数問題の困難さを利用1024
ecdsa2009年にNISTによりFIPSとして採用(dsaのものを改定)されたアルゴリズムで、楕円曲線上の離散対数問題の困難さを利用256, 384, 521
ed25519楕円曲線Curve25519上の離散対数問題の困難さを利用256

公開鍵をホスト側に転送するには、scpコマンドを使う。
  • scp [オプション] コピー元 コピー先:SSHによりリモートホスト上に、もしくはリモートホスト上からファイルをコピー
    -i:秘密鍵ファイルを指定
実行のたびにパスフレーズの入力を要求しないようにする
  • ssh-agent [オプション] コマンド:SSH用の認証エージェントを起動し、秘密鍵情報を保持
  • ssh-add [オプション] ファイル:ssh-agentに秘密鍵を追加
    -l:登録されている秘密鍵情報を表示

10.3.4 SSHによるポート転送

  • sshコマンドを-Lオプションを指定した実行すると、SSH通信を介して通常は暗号化されない通信を暗号化するため、ポート転送を実装できる。
    • ssh -L 2323:192.168.56.11:23 192.168.56.11

10.3.5 GnuPGによるデータの暗号化と復号

GnuPGは公開鍵暗号方式を利用し、メールやファイルに電子署名を付けたり、暗号化したりできるプログラム。
  • gpg [オプション]:GnuPGによる公開鍵ペアの管理、暗号化の実行
    --gen-key:鍵ペアの作成
    --list-keys:キーリングの内容を表示
    -a:インポート、エクスポートの際、ASCII情報で扱う(既定ではバイナリ情報)
    -o ファイル名:出力するファイルを指定
    --export メールアドレス:指定したアドレスの鍵をエクスポート
    --import ファイル名:指定したファイルに含まれる鍵をインポート
    --sign-key メールアドレス:鍵に署名を行う
    -e:指定したファイルを暗号化
    -r メールアドレス:暗号化の際に使用する鍵のアドレスを指定
    -b:署名ファイルを生成(分離署名)
    --verify:署名ファイルを検証
CentOS環境では既定でgpg-agentコマンドが動作しており、利用した秘密鍵情報を保持するようになっている。
  • gpg-agent [オプション]:GnuPGで利用する秘密鍵を管理
    --daemon:デーモンモード(バックグラウンド)で動作
    --use-standard-socket:ソケットファイルを標準の場所に配置

10.3.6 GnuPGによるデジタル署名

  • デジタル署名は、秘密鍵で暗号化したファイル(署名ファイル)を生成し、公開鍵で復号する。
  • 以下の手順は、testuserが作成したファイルをrootユーザーの環境で検証している例
    • $ echo sign test > signtest.txt
      $ gpg -b -a signtest.txt
      $ cp sign* /tmp/
    • 署名が正しいことを確認する例:
      # cp /tmp/sign* .
      # gpg --verify signtest.txt.asc signtest.txt
      gpg: 2020年10月15日 06時53分54秒 JSTにRSA鍵ID DBD07E89で施された署名
      gpg: "Naomi Inoue "からの正しい署名
    • 署名が正しく検証されないことを確認する例:
      # echo test >> signtest.txt
      # gpg --verify signtest.txt.asc signtest.txt
      gpg: 2020年10月15日 06時53分54秒 JSTにRSA鍵ID DBD07E89で施された署名
      gpg: "Naomi Inoue "からの*不正な*署名

10.4 クラウドセキュリティの基礎

10.4.1 クラウドサービス

  • クラウドサービスはインターネット上で提供されているサービスで、利用者(カスタマー)はサーバーやソフトウェアなどを所有することなく、さまざまな機能・サービス・アプリケーションを利用できるという特徴がある。
表10.5 クラウドサービスの主な分類
分類
概要
SaaS(Software as a Service)ソフトウェアをクラウドサービス上で提供
PaaS(Platform as a Service)開発プラットフォームをクラウドサービス上で提供
IaaS(Infrastructure as a Service)インフラ環境をクラウドサービス上で提供

  • IaaS:仮想マシンやネットワーク環境といったインフラ環境をクラウドサービス上で提供するもので、代表的なものは以下の通り。
    • AWS(Amazon Web Service)
    • GCP(Google Cloud Platform)
    • Microsoft Azure
    • さくらのクラウド
    • GMOのクラウド
    • ニフクラ

10.4.2 オンプレミス環境とパブリッククラウド環境

  • オンプレミス環境
    Linuxホストを構成する際、自社の施設内やデータセンターに物理サーバなどのハードウェアやネットワーク回線を用意して構成する環境のこと。
  • パブリッククラウド環境
    クラウド環境でLinuxホストを構成し、不特定多数のユーザーに対してサービスを提供する形態のクラウドサービス環境のこと。


10.4.3 パブリッククラウド環境における認証構成

  • パブリッククラウド環境を利用する場合、管理コンソール(管理用のWebページ)に接続して設定を行う。
  • そのため、接続時の認証処理はとくに厳密に管理する必要がある。
    • 通常のパスワード認証の他、ワンタイムパスワード、バックアップコードなどを用いた多要素認証(MFA:Multi-Factor Authentication)を有効にすることが推奨される。
  • Linuxインスタンスには、SSHで接続して操作するのが一般的。
    • 管理コンソールは、クラウドサービスの管理に利用。
  • インスタンスにはプライベートアドレスが割り当てられ、NAT機能によりグローバルアドレスで接続できるように構成されている。
    • なお、IPアドレスが固定されるサービスを利用していない場合、インスタンスを停止したタイミングでそれまで使用していたグローバルアドレスが解放され、次回起動時には別のグローバルアドレスが割り当てられる。
  • クラウドサービス上でfirewalldなどによりパケットの接続を許可するだけでなく、クラウドサービス側でも接続許可の設定をしないと、各種サービスに接続できない可能性がある。

10.4.4 ストレージの利用

  • クラウドサービス上でインスタンスを構成する際は、ストレージも一緒に構成する。
    • OSなどの領域に利用するストレージは、インスタンス停止時にもデータが保持される不揮発性ストレージを利用するが、クラウドサービスによっては揮発性ストレージ(エフェメラルディスク)を利用できる場合もある。
    • 揮発性ストレージは、インスタンス起動中のみ利用できる高速な読み書きが可能な領域。
  • ストレージのスナップショットを取得することもできる。


10.4.5 クラウドサービスにおける障害時の対応

  • インスタンスやストレージを構成する場合、リージョンによって配置先となるデータセンターの地域を指定できる機能があるのが一般的である。
    • どのリージョンに配置されているかによって適用される法律などが異なる。

10.4.6 脆弱性検査について

  • インスタンスのOSやインストールされたプログラム、インスタンスに配置されたプログラムなどに脆弱性がないかを検査することを脆弱性検査(ペネトレーションテスト)と言う。
  • 脆弱性検査用のツール
    • OWASP ZAP


演習問題

  1. A→❌B
  2. /etc/sudoers→◯
  3. ?→❌ulimit
  4. C→◯
  5. /bin/nologin→❌/etc/nologin
  6. B→◯
  7. B,C→◯
  8. ssh-keygen→◯
  9. B→◯
  10. C→◯
  11. C→◯
  12. B,C→◯
正解率:9/12=0.75(75%)