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

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%)
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

LinuCレベル1取得に向け勉強中:第9章 重要なシステムサービス

2020-10-13 20:49:42 | LinuC
LinuCレベル1合格教本で、勉強を進める。
今回は、『第9章 重要なシステムサービス』である。

 

9.1 システム時刻の保守

9.1.1 システムクロックの表示と設定

  • Linuxでは、次の2つのクロック情報により、日時情報が管理されている。
    • システムクロック:OSが管理
    • ハードウェアクロック:BIOSが管理
表9.1 クロック設定に利用できるコマンド
コマンド
意味
設定の対象
dateシステムクロックの表示・設定システムクロック
hwclockハードウェアクロックの表示・設定ハードウェアクロック
ntpdate, chronycNTPサーバーとシステムクロックの同期システムクロック

NTPサーーとシステムクロックの同期
  • date [オプション] [日時/+書式]:システムクロックの表示・設定
    • システムクロック設定の書式
      date mmddhhmm[yyyy][.ss]
       mm:月
       dd:日
       hh:時
       mm:分
       yyyy:年
       ss:秒
    • システムクロック表示の書式
      date "+%m%d"
      • 使い方例:
        tar cf /tmp/`date "+%m%d"`.tar /home
        →/tmp/0101.tarが生成される

9.1.2 ハードウェアクロックの設定

  • hwclock [オプション]:ハードウェアクロックの設定・確認
    -r(--show):ハードウェアクロックを表示
    -w(--systohc):ハードウェアクロックを、現在のシステムクロックと同期
    -s(--hctosys):システムクロックを、現在のハードウェアクロックと同期

9.1.3 タイムゾーンの設定

  • 日本に存在するホストでタイムゾーンの設定を行うとしたら、次のどちらかを使用するのが一般的。
    • UTC(世界標準時)
    • JSTあるいはAsia/Tokyo(日本標準時):UTCと比べて+9時間
  • タイムゾーンの設定方法はいくつかある。
    • TZ変数で設定
    • /etc/timezoneを編集
    • /etc/localtimeの参照先のファイルをtimedatectlコマンドで変更
  • tzselect:設定できるタイムゾーンの値を表示
  • Debian環境では、/etc/timezoneファイルの内容を書き換えることでタイムゾーンの編集が可能。
  • CentOS環境では、/etc/localtimeファイルによりタイムゾーンの設定を行う。
    • このファイルはシンボリックリンクになっており、参照先は/usr/share/zoneinfo/ディレクトリの各タイムゾーンを表すファイルとなっている。
    • 参照先を変えることでタイムゾーンの設定を変更する。
  • timedatectl [サブコマンド]:日時に関する設定を行う(CentOS、Debian共通)
    status:現在の設定を表示(サブコマンド省略時の動作)
    set-time 日時:日時の設定を変更
    set-timezone タイムゾーン:タイムゾーンの設定を変更

9.1.4 NTPの利用

  • TCP/IPにはNTP(Network Time Protocol)というプロトコルが用意されており、システムクロックの設定に利用できる。
    • ntpdateコマンドをネットワーク上に配置されているNTPサーバー(ntpd)とシステムクロックを同期して、適切な日時を設定可能。
  • ntpdate [オプション] サーバー:ntpサーバーと同期し、システムクロックを設定
    -d:デバッグモードで実行
  • 自分自身をNTPサーバーとして構成することもできる。
    • /etc/ntp.confファイルを編集してntpdの設定を行う。
  • ntpq [オプション] [サーバー]:ntpdの状態を確認
    -p:同期の状態を表示。サーザー名の左の記号で状態を表す。
      *:現在同期中のサーバー
      +:同期の候補となっているサーバー

9.1.5 chronyd

  • 現在はntpdに代わる同期サービスとしてchronydが用意されている。
  • chronydの特徴
    • ntpdと同じくNTPプロトコルを利用したシステムクロックの同期が可能
    • ハードウェアクロックとの同期もサポート
    • 既定ではntpdと同じ123番ポートを利用するが、他のポートを利用するように設定変更も可能
表9.2 ntpdとchronydが利用するコマンドと設定ファイル
サービス名
ntpd
chronyd
設定ファイル/etc/ntp.conf/etc/chrony.conf
同期確認に利用するコマンドntpqコマンドchronycコマンド

  • chronyc [サブコマンド]:chronydの制御を行う
    tracking:同期の状態を表示
    sources:同期先として利用できるサーバーの一覧を表示

9.2 システムのログ

9.2.1 ログ管理サービス

  • Linuxで利用されるログ管理サービスには次のものがある
    • journald
    • rsyslog

9.2.2 journaldによるログ管理

  • 既定では、/run/log/journald/ディレクトリ以下にログファイルが配置されている。
    • system.journalファイルの中身はバイナリデータなので、grepなどのテキスト処理用のコマンドでは参照できない。
  • journalctl [オプション] [条件]:ジャーナルログの参照
    -n 数値:表示するログの件数
    -u ユニット名:表示する対象のユニット
    -p プライオリティ値:表示するプライオリティ(0:emerg〜7:debug)
    --since='日時',--until='日時':日時を指定
    -f:末尾をリアルタイム表示
    -r:逆順に表示
    --list-boots:管理対象となっているブートIDを表示
    -b 数値:指定したブートIDのログを表示。0で現在、-1で前回起動中のログを表示
    --no-pager:ページャーを利用せず、標準出力
  • journaldの設定ファイルは、/etc/systemd/journald.conf
  • journaldに任意の情報を出力したい場合、systemd-catコマンドを利用する。
  • systemd-cat [オプション] コマンド構文:journaldに任意の情報を出力
    -p プライオリティ:プライオリティを指定して出力

9.2.3 rsyslogによるログ管理

  • rsyslogの設定ファイルは/etc/rsyslog.conf
    • 出力先の設定は、セレクタとアクションの組み合わせで設定されている。
表9.3 CentOS環境における主なログファイル
ログファイル
内容
/var/log/messages一般ログ(下記の3つのファシリティに該当しないログを記録
/var/log/secure認証ログ
/var/log/maillogメールログ
/var/log/croncronログ

あるファシリティ、プライオリティが指定されたログメッセージが設定どおりに記録されているかどうかを確認するには、loggerコマンドを使うと便利。
  • logger [オプション] メッセージ:テスト用のログメッセージを送信
    -p ファシリティ.プライオリティ:ファシリティとプライオリティを指定。指定されなかった場合、user.noticeで送信
    -i:PIDを記録
    -t 名前:指定した名前を出力元として記録

9.2.4 ログのローテーション

  • /var/log/ディレクトリに記録されているログファイルは、一定期間が経過するとlogrotateによりローテーションされる。
    • ローテーションが一定回数を超えると、古いファイルから削除される。
    • logrotateの設定ファイルは、/etc/logrorate.conf

9.3 メール配送エージェント(MTA)の基本

9.3.1 MTAの基本

  • MTAとはメールを転送するSMTPサーバーを指す。
  • Linuxで主に利用されているMTAには次のものがある。
    • postfix
    • exim

9.3.2 メールの参照

  • mail [オプション] [宛先]:メールデータを参照、もしくはメールを送信
    -u ユーザー:指定したユーザーのメールデータを参照(rootのみ実行可)
  • /etc/aliasesはメールの転送先を指定する設定ファイル
    • postfixが参照するのは/etc/aliases.dbというバイナリファイル
    • そのため、/etc/aliasesファイルを編集したら、newaliasesコマンドを実行して/etc/aliases.dbに反映させる必要がある。
  • newaliases:メールのエイリアス設定を有効化(/etc/aliases.dbに反映)
転送先のMTAが名前解決できない場合など、メールキューが溜まったままになってしまっている場合には、mailqコマンドで、保存されたままのメールキューを確認できる。
  • mailq:メールキューの内容を表示


演習問題

  1. C→❌B
  2. C→◯
  3. ?→❌none
  4. ?→❌A
  5. logrotate→◯
  6. B,C→◯
  7. A,D→◯
  8. B→◯
  9. .forward→◯
正解率:6/9=0.667(67%)

あんまり理解できていないが、正解率はまぁまぁかな?
ファシリティとプライオリティって重要なのかな?
メールの配送についてもほぼ実践できなかったからよく分からなかったし。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

LinuCレベル1取得に向け勉強中:第8章 システム管理

2020-10-12 00:43:39 | LinuC
LinuCレベル1合格教本で、勉強を進める。
今回は、『第8章 システム管理』である。

8.1 アカウント管理

8.1.1 ユーザーの追加


表8.1 主なユーザー管理コマンド
コマンド
意味
コマンド
意味
useraddユーザーの追加groupaddグループの追加
usermodユーザーの編集groupmodグループの編集
userdelユーザーの削除groupdelグループの削除
passwdパスワードの設定idユーザーとグループのID情報を表示
  • useradd [オプション] ユーザー名:ユーザーを追加
    -u UID:ユーザーIDを指定
    -g グループ名/GID:主グループを指定
    -G グループ名/GID:補助グループを指定
    -c コメント:コメントを指定
    -d ディレクトリ名:ホームディレクトリを指定
    -s パス:ログインシェルを指定
    -m:ホームディレクトリを作成
  • passwd [オプション] [ユーザー名]:パスワードを設定
  • ユーザー追加時にホームディレクトリが作成される際、/etc/skel/ディレクトリの内容を参照して中にあるファイルやサブディレクトリをコピーする。
  • Debian環境(Ubuntu含む)では、-mオプションを指定せずにuseraddコマンドでユーザーを追加すると、ホームディレクトリを生成しない。

8.1.2 グループとユーザーの管理

  • ユーザーはあるグループに対して、主グループ(プライマリグループ)もしくは補助グループ(セカンダリグループ、サブグループ)として所属できる。
  • id [オプション] ユーザー名:指定したユーザーのID情報を表示
  • ユーザー追加時に主グループを指定していなかった場合、ユーザー名と同じ名前のグループ(プライベートグループ)が生成され、そのグループに所属することになる。
  • groupadd [オプション] グループ名:グループを追加
    -g GID:グループID(GID)を指定
  • usermod [オプション] ユーザー名:ユーザーの設定を変更
    -u UID:ユーザーIDを指定
    -g グループ名/GID:主グループを指定
    -G グループ名/GID:補助グループを指定
    -c コメント:コメントを指定
    -d ディレクトリ名:ホームディレクトリを指定
    -s パス:ログインシェルを指定
    -l 新ユーザー名:ユーザー名を指定(新ユーザー名に変更)
    -a:-Gを併用し、補助グループを追加
  • groupmod [オプション] グループ名:グループの設定を変更
    -g GID:グループID(GID)を指定
    -n 新グループ名:グループ名を指定(新グループ名に変更)

8.1.3 ユーザーとグループの削除

  • userdel [オプション] ユーザー名:ユーザーを削除
    -r(--remove):ホームディレクトリも削除
    -f(--force):ログイン中のユーザーを削除
  • groupdel [オプション] グループ名:グループを削除
    • ユーザーが1人でもそのグループを主グループとして所属するよう設定されている場合、そのグループは削除できない。

8.1.4 ユーザーとグループの設定ファイル

  • etcディレクトリのpasswd, shadow, groupファイルのそれぞれの列(フィールド)には以下の情報が格納されている。

図8.3 /etc/passwdファイルの内容
/etc/passwd:ユーザー情報を保持
test01:x:1001:2000::/home/test01:/bin/bash
①       ②  ③     ④  ⑤            ⑥         ⑦
コマンド
項目
説明
ユーザーユーザー名
パスワードパスワード欄。現在では/etc/shadowで管理
UIDユーザーに割り当てられているID
GIDユーザーが主グループとして所属しているグループのID
コメントユーザーの本名などを記憶できる
ホームディレクトリユーザーのホームディレクトリ
ログインシェルユーザーが利用するシェル

  • /etc/default/useraddの確認
[root@centos7 ~]# cat /etc/default/useradd
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

  • vipw:passwdファイルの編集

図8.4 /etc/shadowファイルの内容
/etc/shadow:パスワード情報を保存。一般ユーザーは参照不可。
test01:$6$HTUBwjdV$w7dlKDg/3KRz7...:17952:0:99999:7:::
①                    ②                                         ③     ④  ⑤    ⑥⑦⑧⑨
コマンド
項目
説明
ユーザーユーザー名
パスワードハッシュ化されたパスワード
最終変更日1970/1/1からの通算日数
変更可能最短日数0だといつでもパスワード変更可能
パスワード有効期限いつまで同じパスワードを使い続けられるか
警告日有効期限の何日前に警告を表示するか
使用不可になるまでの日数パスワードの有効期限が経過してからアカウントが使用不可になるまでの日数
アカウント有効期限ユーザーアカウントの有効期限
予約フィールド将来的に使用できるフィールドとして予約

図8.5 /etc/groupファイルの内容
/etc/group:グループ情報を保持
sales:x:2000:test02
①     ②  ③     ④
コマンド
項目
説明
グループグループ名
パスワードグループに割り当てられているパスワード
GIDグループに割り当てられているID
所属メンバーサブグループとして所属しているユーザー

  • getent データベース [エントリ]:NSSライブラリのエントリを出力
    • データベース:出力したい内容を指定
      passwd, shadow, group:それぞれのファイルの内容(第2引数にアカウント名を指定して特定のアカウントの情報を出力するよう指定できる)
      hosts:hostsファイルの内容(第2引数にホスト名を指定して、名前解決に利用できる)

8.2 ジョブ管理

8.2.1 cronによるジョブスケジューリング

  • Linuxでは、次の2つの仕組みでジョブをスケジュール管理できる。
    • cron(anacron):定期的に繰り返すジョブを管理
    • at:一度だけ実行するジョブを管理
  • crontab オプション:cronジョブの編集
    -e:cronジョブの追加、編集
    -l:cronジョブの表示
    -r:cronジョブの削除
図8.6 crontabファイルの書式
crontabファイル:cronジョブを登録
31 10 *  *  *     touch /root/crontest.txt
①  ②③④⑤            ⑥
コマンド
項目
既定値
0〜59
0〜23
1〜31
1〜12/jan〜dec
曜日0〜7/sun〜sat
0と7は日曜日
実行する処理実行するコマンドを1行で設定
実用的にはスクリプトを指定

図8.7 crontabで利用できる主な書式
0 23 *  *  1-5    /testbin/backup.sh
→「-」で連続した値を指定。
この例は月曜日から金曜日の23時ちょうどにスクリプトを実行。

0,15,50 * * * * /testbin/sample.sh
→「,」で複数の値を指定。
この例は毎時0分、15分、50分にスクリプトを実行。

0 4 */2 * * /testbin/ntpdate.sh
→「*/数字」で、「〜に1度」という値を指定。
この例は2日に1度、4時ちょうどにスクリプトを実行。
  • /var/spool/cron/rootファイルにもcronジョブの内容が登録される。
  • cronジョブを操作するための設定ファイル。
    • /var/spool/cron/ユーザー名
    • /etc/crontab
    • /etc/cron.d/ディレクトリ
表8.2 システムが参照するcronジョブ用のディレクトリ
  • etc/cron.hourly/:1時間に1回
  • etc/cron.daily/:1日に1回
  • etc/cron.weekly/:1週間に1回
  • etc/cron.monthly/:1ヶ月に1回
※ 突然、CentOSのrootアカウントに入れなくなった。
色々試行錯誤してたら、以下のコマンドを試すよう言われたので、実行したところ、root権限でログインすることに成功。
その後、passwdでパスワードを設定し直したら、正常に戻った。
  • abrt-cli list --since 1602298603

8.2.2 anacronによるジョブスケジューリング

  • CentOS環境にも、表8.2のディレクトリは存在するが、/etc/crontabにジョブの実行についての設定は書かれていない。
    →その代わりに、/etc/anacrontabというファイルにジョブの実行についての設定が書かれている。
表8.3 cronとanacronの違い
cron
anacron
  • crondが常駐して実行
  • システム起動中、指定したタイミングでジョブを実行
例:3時ちょうどに実行されるよう登録されている場合、その時刻に起動していなければならない
  • cron経由で実行(anacronは常駐しない)
  • システム起動中、適当なタイミングでジョブを実行
例:起動後、1時間に1度、anacronが実行され、未実行だったジョブを実行
 

8.2.3 atによるジョブスケジューリング

  • at [オプション] 時刻:atジョブの編集
    • 主なオプション
      -f ファイル:指定したファイルの内容を実行
      -l:atジョブの一覧表示(=atqと同じ)
      -c ジョブ番号:指定したatジョブの内容を表示
      -r ジョブ番号:atジョブの削除(=atrmと同じ)
    • 引数:時刻の書式
      23:30:その日の23時30分に実行
      4pm + 1 days:翌日の午後4時ちょうどに実行
      noon Jul 31:7月31日の正午に実行


8.2.4 cronとatのアクセス制御

  • cronとatのアクセス制御ファイル
    • /etc/cron.allow,/etc/at.allow:ファイル内に記述されたユーザーのみ利用可能
    • /etc/cron.deny,/etc/at.deny:ファイル内に記述されていないユーザーのみ利用可能
    • どちらのファイルもない:rootユーザーのみ利用可能

8.3 ローカライゼーションと国際化

8.3.1 i18n

  • ソフトウェアを様々な言語環境で利用できるようにすることを国際化(internationalization; i18n)という。


8.3.2 ロケール


表8.4 主なロケール関係の変数
変数意味
LANGすべての項目に使用するロケール
LC_ALLすべての項目に使用するロケール
LC_MESSAGESメッセージに使用するロケール
LC_TIME日時に使用するロケール
LC_MONETARY通貨記号など、金額の表示に使用するロケール

  • locale [オプション]:ロケール情報を確認
    -a:設定できる値を全て表示
表8.5 設定可能な主なロケール
変数意味
CCロケール(POSIX準拠のロケール、英語で表記)
en_US.utf8言語:英語、地域:アメリカ、文字コード:UTF-8
ja_JP.utf8言語:日本語、地域:日本、文字コード:UTF-8

  • export LANG=C:すべての表示項目がCになる。
  • ロケールの設定ファイル
    • Red Hat系(CentOSなど):/etc/locale.conf
    • Debian系:/etc/default/locale(dpkg-reconfigure localesで編集可能)

8.3.3 文字コードの変換


表8.6 主な文字コード
文字コード用途
ASCIIアルファベットや数字などの1バイト文字を表現
Shift-JIS日本語用文字コード。Windows環境などで利用
EUC日本語用文字コード。古いUNIX環境などで利用
UTF-8世界中の文字を表現するためのUnicodeの文字符号化形式の一種。
最近のLinux環境では一般的

  • iconv [オプション] [ファイル名]:文字コードの変換
    -f 文字コード:変換対象となる文字コードを指定(fromの頭文字)
    -t 文字コード:変換後の文字コードを指定(toの頭文字)
    -l:指定できる文字コードの一覧を表示
 

演習問題  

  1. A→◯
  2. C→❌A
  3. groupadd→◯
  4. B,D→◯
  5. A→❌B
  6. C→◯
  7. B→❌D
  8. A→◯
  9. /etc/cron.allow→◯
  10. A,C→◯
  11. locale→◯
  12. C→◯
9/12=0.75(75%)
もうちょい点は増やせたかな?😅 
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

paizaラーニング『Web技術入門編03 :WebAPIを使ってみよう (全10回) 』を受講してみた

2020-10-11 22:48:35 | paiza
本講座最後のレッスン『Web技術入門編03 :WebAPIを使ってみよう (全10回) 』を受講する。

APIに関してもよくわからないのに、WebAPIとは何なんだろう?

01:Web APIについて知ろう

  • API:Application Programming Interface
    自分の機能を他のプログラムから呼び出してもらうための命令や関数
  • Web API
    HTTPを介して呼び出すAPI
  • WebAPIを作る標準的な手法
    • REST:Representational State Transfer
      - HTTPの特徴を活かしたWebサービスの設計スタイル
      - いくつかの制約に合わせてコンポーネントを分離
      - システムがシンプルになり、スケーラビリティを確保
    • JSON:JavaScript Object Notation
      - WebAPIのデータ交換フォーマットとして広く採用
      - JavaScriptの記法をベースにしたデータ記述フォーマット
      - 扱いやすいシンプルな記法
      - 多くのツールやプログラミング言語で利用

02:RESTを理解しよう

  • RESTの設計原則
    - ステートレスなクライアント/サーバモデル
    - すべてのリソースに適用できる、よく定義された操作のセット
    - リソースを指定する統一的な方式
    - Webページが現在の状態を表し、リンクで次の選択肢を示す
  • RESTのメソッド
    - GET 記事を取得する
    - POST 記事を新規投稿する
    - PUT 記事を更新する
    - DELETE 記事を削除する
    • ただし、RESTでは、GETとPOSTの実装しかないため、PUTとDELETEはPOSTで代用。

03:curlコマンドで、Web APIを呼び出そう

  • curl uri:WebサーバーからHTTPでWebページの情報を取得する。
~$ curl https://5f8311c249545c00b8a4c1dc.paiza-user-learning.cloud/~ubuntu/index.php

Hello World

~$

~$ curl https://5f8311c249545c00b8a4c1dc.paiza-user-learning.cloud/~ubuntu/index.php -i
  • ぱいじょキャラのいいね機能API
# 全部取得
curl https://paiza.jp/paijo_charactors

# 名前を指定して取得
curl https://paiza.jp/paijo_charactors?name=kirishima

# 存在しない名前の場合は、404
curl https://paiza.jp/paijo_charactors?name=kiri
curl -i https://paiza.jp/paijo_charactors?name=kiri

# いいね
curl https://paiza.jp/paijo_charactors/like -X POST -d " name=rokumura"

# いいね:存在しない名前の場合は、404
curl https://paiza.jp/paijo_charactors/like -X POST -d " name=neko"
curl https://paiza.jp/paijo_charactors/like -i -X POST -d " name=neko"
  • jq:jsonデータを整形して出力

04:JSONを理解しよう

  • JSONフォーマットの基本
[
 {
  "id": 2,
  "name": "rokumura",
  "favorite_language": "Python",
  "hair_color": "blonde",
  "blood_type": "O",
  "likes": 2096
 },
 {
  "id": 1,
  "name": "kirishima",
  "favorite_language": "Ruby",
  "hair_color": "brown",
  "blood_type": "B",
  "likes": 7457
 },
]
  • jpコマンドで要素を絞り込む
$ curl https://paiza.jp/paijo_charactors | jq .[0]
  • 特定の値を取り出す
$ curl https://paiza.jp/paijo_charactors | jq .[1].name
  • すべての要素の特定の値を取り出す
$ curl https://paiza.jp/paijo_charactors | jq .[].name
  • ダブルクォーテーションなしで出力
$ curl https://paiza.jp/paijo_charactors | jq .[].name -r

05:Web APIでデータを読み込もう - Ruby編

  • RubyでWebデータを取得
require 'open-uri'
require 'json'

uri = 'https://paiza.jp/paijo_charactors'
response = URI.open(uri)
# puts response.read

jsonObject = JSON.load(response)
# puts jsonObject

jsonObject.each do | item |
 puts "#{item['name']}, #{item['likes']}"
end
演習課題では、上記のようにURI.openにしないと通らないっぽい。

06:Web APIでデータを書き込もう - Ruby編

  • open-uri:httpに簡単にアクセスするためのモジュール
    • GETメソッドに使用する
    • uriは文字列で指定する
  • uri:URIを扱うモジュール
  • net/http:HTTPを扱うモジュール
    • GETとPOSTに使用する
    • URIは、uriモジュールで変換する
  • JSONデータを読み込んで変換する
require 'uri'
require 'net/http'
require 'json'

getUri = URI.parse('https://paiza.jp/paijo_charactors')
response = Net::HTTP.get(getUri)
# puts response

jsonObject = JSON.load(response)
jsonObject.each do | item |
 puts "#{item['name']}, #{item['likes']}"
end
  • いいねを投票する
postUri = URI.parse('https://paiza.jp/paijo_charactors/like')
postResponse = Net::HTTP.post_form(postUri, {'name' => 'kirishima'})
puts postResponse.body

07:Web APIでデータを読み込もう - Python編

  • PythonでWebデータを取得
# coding: utf-8
import requests

uri = 'https://paiza.jp/paijo_charactors'
response = requests.get(uri)
# print(response.json())

for item in response.json():
print(item)

08:Web APIでデータを書き込もう - Python編

  • いいねを投票する
# coding: utf-8
import requests

uri = 'https://paiza.jp/paijo_charactors'
response = requests.get(uri)

for item in response.json():
 print(item['name'], item['likes'])

postUri = uri + '/like'
result = requests.post(postUri, {'name':'midorikawa'})
print(result.json())

09:Web APIでデータを読み込もう - PHP編

  • PHPでWebデータを取得
 $uri = 'https://paiza.jp/paijo_charactors';
 $response = file_get_contents($uri);
 // echo $response;

 $jsonObject = json_decode($response, true);
 // print_r($jsonObject);

 foreach($jsonObject as $item) {
  echo implode(',', $item) . PHP_EOL;
 }

10:Web APIでデータを書き込もう - PHP編

  • いいねを投票する
$uri = 'https://paiza.jp/paijo_charactors';
$response = file_get_contents($uri);
// echo $response;

$jsonObject = json_decode($response, true);
// print_r($jsonObject);

foreach($jsonObject as $item) {
// echo implode(',', $item) . PHP_EOL;
echo $item['name'] . ':' . $item['likes'] . PHP_EOL;
}

$postUri = $uri . '/like';
$jsonObject = http_build_query(['name' => 'rokumura']);
$context = stream_context_create (
[
'http' =>
[
'method' => 'POST',
'header' => 'Content-Type: application/x-www-form-urlencoded',
'content' => $jsonObject
]
]
);

$result = file_get_contents ($postUri, false, $context);
print_r($result);
↑インデントめんどいのコピペしたまま。自動でインデント付けるいい方法ないのかな?

感想

演習の中でしれっといいねを押させようとしていることにイラッときた。
何はともあれ、Web技術入門編もすべて完了して達成率も100%になった。
次は何を受講しようか。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

paizaラーニング『Web技術入門編02 : HTMLを理解しよう (全10回) 』を受講してみた

2020-10-10 23:39:27 | paiza
次は、『Web技術入門編02 : HTMLを理解しよう (全10回)』を受講してみよう。

01:HTMLを理解しよう

  • HTML:HyperText Markup Language
    • ハイパーテキストとは、複数の文書を相互に関連付ける仕組み

02:HTMLを構成するパーツを理解しよう

  • HTMLの要素
    • <h1>コンテント</h1>
    • <p>内容<strong>強調</strong></p>
    • <img src='(url)/neko.gif'>←空要素
    • <a href='https://paiza.jp'>paiza</a>

03:HTMLの構造を理解しよう

  • ↓基本的な構造
<!DOCTYPE html>
<html>
 <head>
  <meta charset='utf-8'>
  <title>Welcome to paiza</title>
  <link rel='stylesheet' href='style.css'>
 </head>
 <body>
  <h1>世界の皆さん、こんにちは</h1>
  <p>ようこそ、<strong>paiza</strong>へ</p>
  <img src='neko.gif'>
  <p><a href='https://paiza.jp' >paizaに移動</a></p>
 </body>
</html>

04:class属性とid属性で要素を選択しよう

  • class属性:要素に役割や種類を記述する
    • h2.resume {プロパティ: 値;}
  • id属性:要素を特定するために記述する
    • #works {プロパティ: 値;}

05:HTMLを取得しよう - Ruby編

  • RubyによるHTMLページの読み込み
    • ターミナルでの実行:Ruby getPage.rb
require 'open-uri'

uri = 'https://(url)/paiza.html'
html = open(uri)
puts html.read
  • Webページのタイトルのみを取得
require 'open-uri'
require 'nokogiri'

uri = 'https://(url)/paiza.html'
html = open(uri)
#puts html.read

doc = Nokogiri::HTML(html)
puts doc.title
  • h2タグのみを取得
require 'open-uri'
require 'nokogiri'

uri = 'https://(url)/paiza.html'
html = open(uri)
#puts html.read

doc = Nokogiri::HTML(html)
#puts doc.title

doc.css('h2').each do |element|
 puts element
end
  • 特定の属性を取り出す
doc.css('h2.resume').each do |element|
 puts element['id']
end

06:HTMLを取得しよう - Ruby実践編

  • パイジョのバックナンバーを取り出す
require 'open-uri'
require 'nokogiri'

url = 'https://paiza.jp/paijo'
html = URI.open(url)
# puts html.read

doc = Nokogiri::HTML(html)
# puts doc.title

doc.css('.p-paijo__old-backnumber__link').css('a').each do |element|
 puts element['href']
end
↑多分、クラス名が違っているので修正。

07:HTMLを取得しよう - Python編

  • PythonによるHTMLページの読み込み
    • ターミナルでの実行:python3 getPage.py
# coding: utf-8
import requests

uri = 'https://(url)/paiza.html'
html = requests.get(uri)
print(html.text)
  • タイトル要素を取り出す
    • sudo pip3 install beautifulsoup4
# coding: utf-8
import requests
from bs4 import BeautifulSoup

uri = 'https://(url)/paiza.html'
html = requests.get(uri)
#print(html.text)

soup = BeautifulSoup(html.text, 'html.parser')
print(soup.find('title').string)
  • 指定タグの要素を取り出す
# coding: utf-8
import requests
from bs4 import BeautifulSoup

uri = 'https://(url)/paiza.html'
html = requests.get(uri)
#print(html.text)

soup = BeautifulSoup(html.text, 'html.parser')
#print(soup.find('title').string)

for element in soup.find_all('h2'):
    print(element)
  • 指定の属性の要素を取り出す
for element in soup.find_all('h2', class_='resume'):
 print(element)
  • 指定の属性の値を取り出す
for element in soup.find_all('h2', class_='resume'):
 print(element['id'])

08:HTMLを取得しよう - Python実践編

  • パイジョのバックナンバーを取り出す
# coding: utf-8
import requests
from bs4 import BeautifulSoup

uri = 'https://paiza.jp/paijo'
html = requests.get(uri)
# print(html.text)

soup = BeautifulSoup(html.text, 'html.parser')
# print(soup.find('title').string)

backnumber = soup.find('div', class_='p-paijo__old-backnumber p-paijo__old-backnumber--summary')
#print(backnumber)

for element in backnumber.find_all('a'):
print(element['href'])

backnumber = soup.find('div', class_='p-paijo__old-backnumber p-paijo__old-backnumber--remain')
#print(backnumber)

for element in backnumber.find_all('a'):
print(element['href'])

09:HTMLを取得しよう - PHP編

  • PHPによるHTMLページの読み込み
    • ターミナルでの実行:php getPage.php
<?php
 $uri ='https://(url)/paiza.html';
 $html = file_get_contents($uri);
 echo $html;
  • タイトル要素を取り出す
    • phpqueryのインストール
      $ composer init -q
      $ composer require electrolinux/phpquery
      $ composer dumpautoload
<?php
 require_once 'vendor/autoload.php';

 $uri = 'https://(url)/paiza.html';
 $html = file_get_contents($uri);
 // echo $html;

 $doc = phpQuery::newDocument($html);
 echo $doc['title'];
  • 指定タグの要素を取り出す
<?php
 require_once 'vendor/autoload.php';

 $uri = 'https://(url)/paiza.html';
 $html = file_get_contents($uri);
 // echo $html;

 $doc = phpQuery::newDocument($html);
 echo $doc['h2'];
  • 次のようにも書ける。
    $doc = phpQuery::newDocument($html)->find('h2');
    echo $doc;
  • 指定の属性の要素を取り出す
    $doc = phpQuery::newDocument($html)->find('h2.resume');
 echo $doc;
  • 指定の属性の値を取り出す
    foreach ($doc as $element) {
  echo pq($element)->attr('id') . PHP_EOL;
 }

10:HTMLを取得しよう - PHP実践編

  • パイジョのバックナンバーを取り出す
<?php
 require_once 'vendor/autoload.php';

 $uri = 'https://paiza.jp/paijo';
 $html = file_get_contents($uri);
 // echo $html;

 $doc = phpQuery::newDocument($html)->find('.p-paijo__old-backnumber a');
 // echo $doc;

 foreach ($doc as $element) {
  echo pq($element)->attr('href') . PHP_EOL;
 }

感想

HTMLの基礎を学び、Ruby、Python、PHPでWebページの情報を取得する方法を学んだ。
結局、修了証取得まで2日間かかってしまった。
各言語でのWebページの取得は、同じ内容を各言語で実装するので、やや冗長であると感じた。
1本の動画を3分程度にするには、多少冗長になっても、逆に細切れにしないと収まらないのであろう。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする