nakayumcの技術ブログ

エンジニア2年目のブログです。

ICTSC2021夏の陣に参加してみたので感想など

8/28~8/29で開催された、ICTSC2021 夏の陣に専門学生5人組でチーム名 オ〇フェーブルを実装してください! で参加しました。 チーム名、私はよくわかりませんが、ウ〇娘関連のなんからしいです(?)

最終的に順位が確認できた時点での結果としては 11位で1425点でした。 メンバー全員が初めてトラコンに出ましたが、初めてにしてはかなり解けていたんじゃないかなぁって気がします。みんな頑張った。みんなえらい🌝

参加前

先生に誘われて、「トラコンってどんな感じなんだろう…?やってみたい」と思い参加を決めました。 過去問を見てもどうすればいいのかわからなかったのでぶっつけ本番でいきました。

本番での流れ

1日目

9:30 学校に集合。同じ学校内でも他チームもいました。 9:30~10:00 VNCクライアントのセットアップと踏み台サーバへのアクセスをしました。 10:00~12:00 問題が公開されたのでみんなで問題を見ながらDiscordで「これやります」って宣言しながらやりました。 12:00~12:30 お昼休憩 12:30~16:30 午後も同じようにみんな集中してやっていました。できたときはみんなで「やった!!」って喜んでました。

1日目は6位で、975点でした。結構できたと思う。

2日目

9:30 1日目と同じように学校に集合。開始前にこんなスプレッドシート作ってみんなで共有するようにしました。 10:00 踏み台サーバへのアクセスをして各自問題を解いてました。 10:00~12:00 各自問題解いてました。 12:00~12:30 お昼休憩 12:30~16:30 午後もみんな頑張って問題解き。

本番で私が触れた問題の感想

私はサーバ系の問題を主に解きました。解いた問題を紹介していきます。

解いた問題

ンジンエックス 150pt

curl --http2 localhost してもリソースが取得できない! ・sudo /usr/local/nginx/sbin/nginxで実行時にエラー吐いてて起動しない! これらの問題を解決する問題でした。

あとはホームディレクトリにnginx-1.21.1が既に置いてあって、再展開するために用意されていました。 最初、とりあえずエラーを見るためにsudo /usr/local/nginx/sbin/nginxを実行してみると 「http_v2_moduleのモジュールが足りないから実行できないよ」ってエラーが出ました。

コンパイルするときに必要なOpenSSLのモジュールがどこにあるのか分からなかったので、ここからwgetでもってきて踏み台サーバからscp使って問題サーバに転送させました。

http_v2_moduleのモジュールを追加する方法を検索したら、nginx-1.21.1内で./configure --with-http_v2_module を追記して再展開すればできるということがわかったので、このコマンドを実行して makemake installをしました。

これでもう一度sudo /usr/local/nginx/sbin/nginxをすると起動できたので curl --http2 localhost と打ったらcurl: (1) Received HTTP/0.9 when not allowedと怒られたので/usr/local/nginx/conf/nginx.confに以下を追記しました。

listen 443 http2;
↓
listen 80;

これを提出したら満点を取ることができました。

頑固なindex.html 150pt

OSを再起動すると編集したのにindex.htmlが元の状態("Welcome to ICTSC"とだけ書かれた状態)に戻ってしまうのでそれを治して欲しいという問題でした。

まずは、cronとかsystemdが悪さしているのかな、とかlinux起動時に自動的に実行するコマンドが原因なのかなと思って検索したんですが良い文献が見つかりませんでした。 なのでとりあえず / 以下で grep -rl 'index.html' と検索すると,/etc/tmpfiles.d/以下に ictsc.conf というファイルがあって、'Welcome to ICTSC'と書かれたファイルがあることが分かったので、rm -rf ictsc.conf(良くない)コマンドで永遠に消えてもらいました。 tmpfiles.d について調べると、OS起動時にファイルを作るスクリプトを置く場所らしいです。 これを記述して満点もらうことができました。

その他にも、サーバ気象予報 150ptの問題や、何もしてないのに壊れた! 150ptの問題をやって2日間が終わりました。 初めてにしては結構頑張れていたのかなと考えてます。

感想・所感

難しいトラブルの問題が多かったですが、解決できた時の達成感が得られてとても楽しかったです!

私はサーバ系は結構できていた感じはしていますが、ネットワークの問題やk8s、dockerなどは全く知見がなく、手を出すことができませんでした。

運営さん、コンテストを開いていただきありがとうございました!! 去年は色々あったみたいですが今年も開催されて良かったです。 冬にももしかしたらあるらしいのでまた機会がありましたら是非参加していきたいです。皆さんお疲れ様でした。

1週間でCompTIA Secrity+ に合格した話

2022/05/20 追記: リンクが一部開けなかったので修正いたしました。

TL;DR

取得した経緯

昨年の6月頃に学校で、先生がCompTIA Security+のバウチャ2枚あるけどほしい人?に手を挙げてバウチャチケットを頂いていたのを忘れていて、 1週間で取得できたので書いていきたいと思います。

CompTIA Sec+とは?

CompTIA Security+ は、世界中で提供している資格試験の一つで国内のみならず海外の企業もこの資格を認知している世界的に有名な資格です。

CompTIA Security+は、ベンダーニュートラルの認定資格です。Security+認定は、業務を遂行する上で必須となるエントリーレベルのセキュリティスキルおよび知識を判断する、国際的に認められた認定試験で、世界中の企業およびセキュリティプロフェッショナルに活用されています。 CompTIA Security+認定資格試験に合格することで、アプリケーション、ネットワーク、デバイスのセキュリティを確保するために必要なシステムのインストールと設定、プラットフォームへの脅威を分析して適切な手法で緩和する対応、関連するポリシーや法規制を正しく認識した運用を行うために必要な知識とスキルを証明します。また、これらのタスクを、機密性、完全性、可用性の三大要件を維持し実行が可能なスキルを証明します。 出典 https://www.comptia.jp/certif/core/comptia_security/

出題範囲として、

  • セキュリティの基本知識(機密性,完全性,可用性等)
  • 各セキュリティ技術に関する知識暗号化・認証
  • アクセス制御に関する知識
  • 各脅威に対する対策に関する知識
  • ネットワークセキュリティ(SW,Router,FW,IDS,IPS,Proxyなど)に関する知識
  • リスク管理に関する知識
  • セキュリティマネジメントに関する知識

こんな感じで、セキュリティの結構深いところまで問われる試験です。

CompTIA Sec+を 1週間で一発合格のための勉強方法

私は3つの方法で取得できたので紹介します。 本はメルカリで購入しました。

1. テキストを一通り読みまくる(2日)

必要な知識を覚えるために、パラパラめくる感じで以下のテキストを読んで勉強しました。

2.問題集を解きまくる(2日)

問題自体を覚えるために、以下の問題集を5周くらいしました。

3.TACのWeb模擬試験の問題を覚える(3日)

TACのWeb模擬試験の申し込みサイト

この模擬試験は2回分の模擬試験があり、8割程度が全く同じ問題が出題されます。 私の場合はこんな感じで模擬試験に合格できました。

一番覚えておきたい問題が、「パフォーマンスベースドテスト対策」です。 ここは絶対に試験に出ると思います。TACのWeb模擬試験でしか受けることが出来ないので何度もやることをおすすめします。

受験方法と当日

みなさんお馴染みのピアソンVUEで試験日、試験会場を申し込みます。

試験会場について、受付で顔写真の撮影とサインなどがあるので試験開始時刻より15分前ぐらいに到着する必要があります。 そのときに、本人確認書類2点が必要です。 私は「マイナンバーカード (顔写真があるやつ)」と「学生証」の2点を出しました。

試験室に入って席に着いて、PCをいじると規約とかが出てきます。 何度かポチポチすると、いよいよ問題が始まります。

問題が始まると、最初に「パフォーマンスベースドテスト対策」が出てきました。

問題は何度も見返しができ、見直したい問題にはフラグ「見直し旗」を付けます。 どうしても分からない問題が数問あり、時間ギリギリまで何度も見直しました。

試験終了後、アンケートの後に合否が画面に表示されます。 結果は「合格」でした。

合格ライン750点で、762点で合格できました。ギリギリでした。

まとめ

私はこのような感じで合格することが出来ました! みなさんも受ける時の参考にしていただけると幸いです。 最後まで見て頂き、ありがとうございました。

 

SDCCに参加してグローバルIPを取得した話

はじめに

最近SDCC(島根データセンター友の会)に加入しました。 加入すると、オープンネットワークに接続することで様々なことを行うことができ、 申請すればグローバルなIPアドレスを貰えるのでサーバーを公開することができます。

今回はCisco 1941を使用してSDCCへ接続し、BGPで経路情報を受け取るところまでまとめます。

参加方法

はじめにSDCCに参加できるかどうかを調べます。 BGPというプロトコルを使うので一般のご家庭にあるルーター(バッファローなど)では接続できません。 CiscoYAMAHAなどのBGPに対応したルーターを買ってください。

準備ができたらここからメールを送信して申し込みしましょう!

トンネルの接続する情報を取得

申し込みをして、申請書を提出するとSDDCの管理者から会員証が届きます。 その会員証に、自分のAS番号やアカウント情報、割当られたIPアドレスなどが書いてあり、その接続情報を使用して対向とトンネルを掘ります。

・どのトンネリングプロトコルを使うのか? ・接続に使用するIPアドレスはどれを使うのか?

など、接続に必要になる情報を相手と相談して決めます。

今回はグローバルIPv6アドレスを使用し、対向のルーターGREというトンネリングプロトコルを使用してトンネルを張り、BGPで経路情報を受け取ります。 ここまで決めればあとは設定するだけです!

トンネルの設定

実際に設定を入れる前に1度情報を整理します。

使用するトンネリングプロトコル GRE

トンネルインターフェイスIPアドレス

相手側 IPv4 100.80.X.0 IPv6 2001:XXXX:XXXX:XXXX::1/127

自分側 IPv4 100.80.X.1 IPv6 2001:XXXX:XXXX:XXXX::0/127

トンネルインターフェイスIPアドレス 相手側 2001:XXXX:XXXX::1 自分側 2407:XXXX:XXXX::0

トンネルの通信を流すときに使用するIPアドレス

自分側: 2400:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:6D81 相手側: 2408:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:A129

使用するルーティングプロトコル BGP

AS番号 相手側 413XXXXX01 自分側 411XXXXX01

ルーターID

特に縛りは無かったのですが、設定しないと要らぬトラブルを招く恐れがあったので、トンネル用のIPv4アドレスをIDとして設定する事にしました。

100.80.XX.0

これで最低限のトンネルを張って経路を受け取れます。 設定は完璧である事を信じて設定を入れていきます!

トンネルの設定

interface Tunnel0
 ip address 100.80.XX.0 255.255.255.254
 ipv6 address 2001:XXXX:XXXX:400::/127
 tunnel source 2400:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:6D81
 tunnel mode gre ipv6
 tunnel destination 2408:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:A129
exit

BGPの設定

router bgp 413XXXXX01
 bgp router-id 100.80.XX.0
 bgp log-neighbor-changes
 neighbor 2001:XXXX:XXXX:XXXX::1 remote-as 4100200001
 neighbor 2001:XXXX:XXXX:XXXX::1 update-source Tunnel0
 neighbor 2001:XXXX:XXXX:XXXX::1 version 4
 neighbor 100.80.XX.1 remote-as 4100200001
 neighbor 100.80.XX.1 update-source Tunnel0
 neighbor 100.80.XX.1 version 4
 address-family ipv4
  no neighbor 2001:XXXX:XXXX:XXXX::1 activate
  neighbor 100.80.XX.1 activate
 exit-address-family
 address-family ipv6
  neighbor 2001:XXXX:XXXX:XXX::1 activate
 exit-address-family
exit

 

設定を入れたら経路が落ちてくるのをを待ちましょう。

経路が落ちてきているかどうかどうかは show ip routeshow ipv6 routeコマンドで確認できます。

もしなにも落ちてこないという方は原因を探ってみましょう。

  1. トンネルが正しく張れているか確認する
  2. BGPのピアが上がっているか確認する
  3. フィルターの設定を見直す

トンネルが正しく張れているか確認する

まずは相手のトンネル用インターフェイスpingを送って反応があるか確認します。

今回は2001:XXXX:XXXX:XXX::1が相手のトンネル用インターフェイスIPアドレスなので、こことの疎通を確認します。

次に、相手のトンネル終端アドレスにpingを飛ばします。 2400:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:6D81pingを送ります。

もしpingが通らないようでしたら原因を探しましょう。

BGPのピアが上がらなくて沼にはまった

私は、neighbor 100.80.XX.1 dont-capability-negotiateというコマンドがシスコのルータが自動で入力されてしまい、AS番号が正しく相手に送れていない問題がありあました。

no neighbor 100.80.XX.1 dont-capability-negotiateコマンドを入力したらピアが上げることができました!!

なかなかこういうことやるひとがいないので・・・あまり情報が・・・ないです...

サーバーを接続して通信してみる

SDCCから割り当てされたIPアドレスを使用して、実際に外部と通信してみます。

G0/0にv4とv6アドレスを割当て、G0/1にL2SWをかましてサーバを接続し、IPを割り当てて通信してみましょう。

設定が正しくできていれば実際にインターネットに出ることができ、実際にインターネットから通信を受け取る事ができるようになります。

あとがき

ここまでできれば後はサーバーを用意したりして遊べるようになっているはずです。

もしやる事が無くなってしまったら、ほかのSDCC加入者の方とBGPのピアを貼ってみてください。

LinuC-1 に合格した話

取得した経緯

学校で掲示されていたパンフレットで「学校でLinuCのチケットを買うと、LinuC 101、102がそれぞれ1万円で受けられる」ので取得してみました。

LinuC とはなんぞや?

簡単に言えば、Linuxの認定資格 LPI-JAPAN公式HPを見た方がわかりやすいかと思います、、。

お家騒動的なのがあってLPICとLinuCがあるみたいです。 資格のレベル感はあまり変わらないみたいですが、 LPIC: 世界的 LinuC: 日本独自 らしいです... 。

勉強方法

・まず合格教本でざっと読む ・実際に触ってコマンドを叩いてみる ・問題集を解く ・ping-tの問題集とコマ門を少しやりました。

使った本

最短突破 LinuCレベル1 バージョン10.0 合格教本[101試験, 102試験対応][Amazon] ・Linux教科書 LinuCレベル1 スピードマスター問題集 Version10.0対応 [Amazon]

この本を使ってました。

本番の試験

まず、Pearson VUEで申し込む。

当日は10分前ぐらいに着いて、説明を聞いたり、顔写真を撮ってもらったらテストスタート。 ほとんどの問題が、選択問題でした。

事前に練習していた問題とほぼ似ている、全く同じ問題が出ました。 そのおかげで、最初に問題を見た段階で「あ、この問題分かる、分からない」 がすぐ判断できます。

テストが終わると、すぐに合否が出ます。

点数は、最低200点で、最高が800点です。

私の点数は、
101試験: 706点

102試験: 666点

だったので、100点満点にすると、80ー90点くらい取ることができたと思います。

資格にチャレンジしてわかったこと

こんなに本買う必要なかったと思いました。

試験日先に決めて、申し込んでおくと、 ・お金かかってる ・時間が限られている

と自分にいい意味でプレッシャーをかけられます。 私の場合、2週間前に、試験の予約をして、超集中型で取り組めました!

かなりおすすめです!

Apache(httpd)をソースから構築する

概要

今回はソースからインストールしてLAMP環境を構築していきます。必要になるものはなるべくソースからインストールしていますが、wgetgccはdnfコマンドでパッケージからインストールします。この記事は Apacheをソースからインストールします。MySQLPHPは次回の記事でインストールしていきます。

環境

OS - ホスト: ESXi 7.0.1 - OS: CentOS8 (最小限のインストール)

使用ライブラリ - apache-2.4.46 - apr-1.7.0 - apr-util-1.6.1 - openeel-3.0.0 - pcre-8.44 - expat-2.3.0

事前準備

Apacheソースコードからインストールするためには、gccmakepcrepcre-devel のライブラリが必要になります。 なので、それらをあらかじめインストールしておきます。

# dnf install gcc gcc-c++ make pcre pcre-devel perl wget

httpdをソースからインストール

今回は、ソースからApache(httpd)をインストールしていきます。 以下のページにApacheのビルドに必要なライブラリやインストール手順が書かれていて、ここを参考にしています。 Compiling and Installing – Apache HTTP Server Version 2.4 これに従うと、APRAPR-Util と PCRE というのライブラリが必要になりますが、その他にもExpatというライブラリや追加した方が良いモジュールもあるので、作業がスムーズになるように整理してまとめていきます。 まず、Apache本体をダウンロードします。

# cd /usr/local/src 
# wget https://ftp.yz.yamagata-u.ac.jp/pub/network/apache/httpd/httpd-2.4.46.tar.gz
# tar zxvf httpd-2.4.46.tar.gz

APRAPR-Util

APR(Apache Portable Runtime)は、Apacheのサポートライブラリで、OS等の環境の違いを吸収する機能です。使用するOSが、機能が備わっていない場合、このAPRが代わりとなってその機能を提供してくれます。

# wget http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/apr/apr-1.7.0.tar.gz
# tar zxvf apr-1.7.0.tar.gz
# mv apr-1.7.0 httpd-2.4.46/srclib/apr

APR-Utilも同様に、ダウンロードと解凍をして、解凍できたディレクトリをhttpd-2.4.46/srclib/apr-utilに移動させます

# wget http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/apr/apr-util-1.6.1.tar.gz
# tar zxvf apr-util-1.6.1.tar.gz
# mv apr-util-1.6.1.tar.gz httpd-2.4.46/srclib/apr-util

以上でAPRAPR-Utilの準備は終わりです。

PCRE

PCRE(Perl Compatible Regular Expressions)は、Perl互換の正規表現を他の言語でも使えるようにするもので、多くのミドルウェアで必要とされているライブラリです。 事前準備が終わっていなければ、インストールしてください。 PCREのビルドをしていきます。wget でダウンロードして、展開・解凍を行い、解凍・展開してビルドします。

# wget https://ftp.pcre.org/pub/pcre/pcre-8.44.tar.gz
# tar zxvf pcre-8.44.tar.gz
# cd pcre-8.44.tar.gz
# ./configure 
# make 
# make install

Expat

Expatとは、XMLファイルの中身のデータを解析・整形するライブラリです。 Welcome to Expat! · Expat XML parser のサイトから、wget でダウンロードして、展開・解凍を行い、解凍・展開してビルドします。

# wget https://github.com/libexpat/libexpat/releases/download/R_2_3_0/expat-2.3.0.tar.gz 
# tar zxvf expat-2.3.0.tar.gz 
# cd expat-2.3.0.tar.gz 
# ./configure 
# make 
# make install

OpenSSL

これでApacheのビルドができますが、TLS通信は必須なので、OpenSSLをソースからビルドしていきます。 この段階で設定しておかないと、後からOpenSSLを使用できないからです。(再度ビルドすることになる)

# wget https://www.openssl.org/source/openssl-3.0.0-alpha14.tar.gz
# tar zxvf openssl-3.0.0-alpha14.tar.gz
# cd openssl-3.0.0-alpha14.tar.gz
# ./config
# make
# make install

Apacheのビルド

これで準備ができたので、Apacheをビルドしていきます。

# cd httpd-2.4.46/
# ./configure \
--prefix=/usr/local/httpd \
--with-included-apr \
--with-pcre=/usr/local/src/pcre-8.44/pcre-config \
--enable-mods-shared=all \
--enable-ssl \
--with-ssl=/usr/local/ssl \
--with-mpms-shared=all
# make
# make install

configureのオプションは以下の通りです。

オプション 説明
–prefix インストールするディレクトリを指定
–with-included-apr srclib内のAPRAPR-Utilもビルド対象にする
–with-pcre インストールしたPCREのディレクトリを指定
–enable-mods-shared 動的モジュールをビルド対象にする
–enable-ssl sslモジュールをビルド対象にする
–with-ssl インストールしたOpenSSLのディレクトリを指定
–with-mpms-shared worker, prefork, eventをビルド対象にする

ビルドができたら、新しくapacheのユーザとグループを作成し、メイン設定ファイルを変更します。 サービスを動かす用のユーザなので、デフォルトシェルに/sbin/nologinを指定して、ログインを禁止にします。

# cd /usr/local/httpd/
# groupadd apache
# useradd apache -g apache -s /sbin/nologin
# chown -R apache.apache .
# vi conf/httpd.conf

# vi /usr/lib/systemd/system/httpd.service
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
ExecStart=/usr/local/httpd/bin/apachectl start
ExecReload=/usr/local/httpd/bin/apachectl graceful
ExecStop=/usr/local/httpd/bin/apachectl stop

[Install]
WantedBy=multi-user.target

以下のコマンドで変更を反映させます。

# systemctl daemon-reload

ファイアウォールの設定を変更して、HTTP/HTTPS通信用の待ち受けポートを開放させます。

# firewall-cmd --add-service=http --zone=public --permanent
# firewall-cmd --add-service=https --zone=public --permanent
# firewall-cmd --reload

自動起動&今すぐ起動の設定を行います。

# systemctl enable httpd --now

まずはcurlコマンドでページをとってこれるか確認します。

# curl http://192.168.1.220
<html><body><h1>It works!</h1></body></html>

そしたら、実際にWebブラウザで開いてみて、この画面が表示されればApacheがビルドして、起動することができています。

まとめ

こんかいは、Apacheのみでしたが、これから、LAMP環境のMySQL PHPのソースからのインストールに挑戦していきたいと思います。

ESXi7.0でVMFSL領域を減らしてデータストアの容量を増やす方法

TL;DR

・ESXi7.0からコンテナに対応するため、ESX-OSData(VMFSL領域)が作られます

・VMFSLの容量を減らすにはインストール時にオプションを付ける必要があり、既にインストール済みの方はクリーンインストールする必要があります。 減らす方法は以下をご覧下さい。

概要

バージョン7.0の新機能等はこちらのリリースノートに詳しく詳細が記載されています。

簡単に言うと「Kubernetesへのネイティブに対応するため」で、要するにコンテナ対応です。

まず、公式ガイドの ESXi ハードウェア要件をまとめると以下のようになります。

  • ESXi 6.7 まで - 最低 1 GB の起動デバイス - VMFS ボリュームと 4 GB のパーティションを起動デバイスに作成するには、5.2 GB 以上のデバイスが必要(HDD/SSD/SAN 等) - SDカード、USB メモリをブートデバイスとする場合はコアダンプの保存に利用するため 4GB 以上、推奨は 16 GB 以上のフラッシュドライブの利用が推奨されている
  • ESXi 7.0 から - 最低 4 GB の起動デバイス - SD カード、USB メモリをブートデバイスとする場合は 8 GB 以上が推奨 - HDD、SSD、NVMe などのその他のデバイスでは 32 GB 以上が推奨され、ブート パーティションESX-OSData ボリュームが作成される - 138GB を超える HDD、SSD、NVMe ドライブの場合は ブート パーティション、ESX-OSData ボリューム、および VMFS データストアが作成される

このように、ESXi 7 では新たに ESX-OSData という VMFS-L フォーマットの新しい領域が作成されます。

可変の ESX-OSData が 120GB まで拡張されるため、VMFSで利用できる容量が少なくなってしまいます。

VMFSL(VMFS-L)を減らす方法

「コンテナなんか使わないのに!」と考えている方(大半がこれ)は無駄な容量なので削減したいところですが、この領域を減らすにはインストール時に起動オプションを入れる必要があり、インストール済みの方は再度クリーンインストールする必要があるということです。

※インストール後は減らすことが出来ません。 もし出来たら連絡していただけますと幸いです。修正いたします。

ではやり方を説明していきます。

この操作を実行したことによって損害が発生しても責任は負えません。 自己責任でお願いいたします。
※ライセンスキーを控える、仮想マシン等のデータは別のデータストア(他のHDDやSSD)に移しておくことをおすすめします。

いつも通りにrufusなどでESXiのインストーラを作成してください。 インストーラーが起動したら、すぐに(右下に書いてある)SHIFT + O を押して、起動オプションを編集します。

既に、cdromBoot runweaselが記述されているので、うしろに(今回は8GBでインストールを進めます)

autoPartitionOSDataSize=8192

を追記(大小文字は区別されます)して、Enterを押してください。

あとはそのままインストール作業をしてください。インストールできたら、Web管理画面に移動して、パーティションを確認してみましょう。

このようにVMFSLの領域が8GBになっています。

まとめ

VMFSLが大量に浪費されているのは Kubernetes へのネイティブな対応するためでした。これで容量を増やすことができると思います。 それでは、楽しいESXiライフを。

RHEL8でNginx1.18+PHP7.4+MariaDB10.3でWordPressをインストールする

はじめに

WordPressをRHEL8環境下でインストールしたので備忘録として手順をまとめます。

CentOS8が、2021年12月31日にサポートが終了してしまうので、代わりのOSを探していたところ、2月1日から個人開発者には本番環境を含む最大16システムまで無料でRed Hat Enterprise Linuxの利用が認められるようになりました。(個人でも商用でも1人で使用するサーバに限られるようです。)  

インストールした環境

- ホスト: ESXi 6.7
- OS: Red Hat Enterprise Linux 8
- nginx 1.18
- PHP 7.4
- MariaDB 10.3
- WordPress 5.7

今回はRed Hat CDNを使用して [サーバー] で進めました。

各パッケージのインストールと設定

RHEL8ではパッケージ管理に大きな変更がありました。 Red Hatからリリースされるコンテンツは BaseOS と Appstream の二つのリポジトリから配信されるようになり、特に Appstream では、従来のパッケージ形式のソフトウェア管理に加わる形で、新たにモジュールという概念が追加されました。 モジュールとは、小さなリポジトリの集合から構成されるもので、RPM をさらに拡張させた新たなパッケージ管理の仕組みです。yum コマンドの使用感をそのままに新たな概念が導入された結果、dnf コマンドにはパッケージ形式とモジュール形式という二つのインストール形式が共存することになりました。

nginx1.18のインストール

普通に dnf module install でインストールすると1.14のバージョンがインストールされます。 下記のコマンドを叩いてみてください。

dnf module list nginx

この画像を見てみると、Stream列のところの 1.14 に [d][e] となっていますね。これは、インストールされるデフォルト[d]のバージョンが1.14で、それが有効[e]になっていることを示しています。ですので、dnf module install で進めると1.14がインストールされるわけです。

なので、下記のコマンドで1.18のnginxをインストールします。

dnf module install nginx:1.18

nginxの起動&自動起動の有効化

下記のコマンドで起動と自動起動の有効化が同時にすることができます。

systemctl --now enable nginx
firewalld (ポート着信許可設定)

次に、firewall-cmd コマンドで http(80) と https(443) のポートを開けていきます。

firewall-cmd --permanent --add-service=http
success

firewall-cmd --permanent --add-service=https
success

firewall-cmd --reload
success

firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens192
  sources:
  services: cockpit dhcpv6-client http https ssh <- ここに「http」と「https」が追加されたことを確認
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

次に、正しくポートが空いているか実際に確認します。

サイトにアクセスできるか確認

これでサーバのIPアドレスでアクセスすると下記のような画面が表示されます。

この画面が出れば、正しくポートが開いています。

PHP7.4のインストール

PHPも同様に、dnf module install を使用して、インストールしていきます。

dnf module install php:7.4

あと、WordPressを動かすのに足りないパッケージもインストールします。

dnf install php php-devel php-mysqlnd php-pdo php-gd

PHPのバージョン確認

バージョンが7.4であることを確認します。

# php -v
PHP 7.4.6 (cli) (built: May 12 2020 08:09:15) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.6, Copyright (c), by Zend Technologies
 
# php-fpm -v
PHP 7.4.6 (fpm-fcgi) (built: May 12 2020 08:09:15)
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.6, Copyright (c), by Zend Technologies
PHPのバージョン非表示

続いて、PHPバージョンを非表示にしていきますWappalyzerという chrome拡張機能でバージョンが 7.4.6であることが分かってしまいます。このような状態だと、攻撃に有用な情報を取得される可能性がありますので念のため非表示にします。

変更するには /etc/php.ini ファイルを変更します。

vi /etc/php.ini

目安として380行目あたりにあると思われますが、expose_php = On を Off に変更します。

;;;;;;;;;;;;;;;;;
; Miscellaneous ;
;;;;;;;;;;;;;;;;;

; Decides whether PHP may expose the fact that it is installed on the server
; (e.g. by adding its signature to the Web server header).  It is no security
; threat in any way, but it makes it possible to determine whether you use PHP
; on your server or not.
; http://php.net/expose-php
expose_php = On <- Off に変更

/etc/php-fpm.d/www.conf のユーザ変更
vi /etc/php-fpm.d/www.conf

/etc/php-fpm.d/www.confをスーパーユーザーのテキストエディタで開き、下記のように2つの箇所を変更してください。

変更前
user = apache
group = apacheapache の部分をnginxに変更

変更後
user = nginx
group = nginx
変更前
;listen.owner = nobody
;listen.group = nobody
;listen.mode = 0660

↑コメントを外して、nobody を nginx に変更

変更後
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

編集が終わったら保存してエディタを終了します。

また、このままだとセッションを保存しておくディレクトリの所有者が apache になっていて、ユーザーのログインなどが出来なくなってしまうのでchownコマンドで変更します。

chown -R nginx:nginx /var/lib/php/session

これができたら起動します。

systemctl enable --now php-fpm

MariaDB10.3 のインストール

MariaDBは dnf install を使用してインストールしていきます。

dnf install mariadb-server mariadb

起動&ユーザー作成

まずMySQLを起動と自動起動を有効化します。

systemctl enable --now mariadb

そしたら、mysql_secure_installationコマンドで、rootパスワード設定と初期設定をしていきます。

mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):何も打たずにEnter
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] y
# パスワード入力
New password:
# パスワード再入力
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

# 匿名ユーザを削除するか? [y]を選択
Remove anonymous users? [Y/n] y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

# rootユーザのリモートログインをブロックするか? [y]を選択
Disallow root login remotely? [Y/n] y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

# テストDBを削除するか? [y]を選択
Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

# 権限テーブルをリロードするか? [y]を選択
Reload privilege tables now? [Y/n] y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!
データベース作成

MySQL内でWordPress用のDB、ユーザ作成をします。
ユーザへ権限付与 MySQL 8.0から GRANT文でのユーザ作成ができないので、CREATE文でユーザ作成をして、権限付与しています。 また、MySQL 8.0からユーザ作成はcaching_sha2_password形式がデフォルトの設定になっていますが、PHP7.2以降は対応していないので従来のmysql_native_password形式指定をしています。

これらのコマンドでデータベースとユーザーを作成してください。パスワードに関しては、rootに設定したものとは別のものにすることをお勧めします。

mysql -uroot -ppassword <-オプションと文字列をくっつける

Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.3.27-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> create database wp_database default character set utf8;
Query OK, 1 row affected (0.001 sec)

MariaDB [(none)]> grant all on wp_database.* to wp_admin@localhost identified by 'wp_admin用のパスワード';
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> exit
Bye

Wordpressのインストール

wgetコマンドで WordPress をダウンロード、/var/www/html/wordperssに展開しました。さらにchownコマンドで 所有権をnginxに設定します。

cd /tmp/
wget https://ja.wordpress.org/latest-ja.tar.gz
tar zvxf latest-ja.tar.gz -C /var/www/html/
chown -R nginx:nginx /var/www/html/wordpress
ll /var/www/html/wordpress/

nginxの設定

以下の内容に書き換えてください。心配な方は必要に応じて元の記述内容をコメントアウトしてください。

vi /etc/nginx/conf.d/wordpress.confuser nginx;
worker_processes auto;
error_log /var/log/nginx/main_error.log warn;
pid /var/run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 2048;
    multi_accept on;
    use epoll;
}

http {
    server_tokens off;  #これをどこかに追加

    server {
        listen 80;
        server_name _;

        location / {
                return 301 https://example.com$request_uri;
        }
    }

    server {
        listen 443 ssl;
        server_name example.com;

        access_log  /var/log/nginx/ssl_access.log  main;
        error_log  /var/log/nginx/ssl_error.log warn;

        index index.php index.html;
        root /var/www/html/wordpress;

        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
        ssl_trusted_certificate /etc/letsencrypt/live/example.com/fullchain.pem;

        location ~* /wp-config.php {
                deny all;
        }

        location / {
                try_files $uri $uri/ /index.php$is_args$args;
        }

        location ~ \.php$ {
                include fastcgi.conf;
                fastcgi_pass   unix:/run/php-fpm/www.sock;
        }
    }
}

example.com となっている場所はすべてご自身のドメインに置き換えてください。編集が終わったら nginxを再起動してください。

systemctl restart nginx

SELinuxの設定

SELinuxが有効化された状態だと、PHPでのファイル書き込みとインターネット通信が制限されてしまうので、テーマやプラグイン、アップデートのインストールができません。なので、これらを許可する必要があるので、下記のコマンドを叩きます。

setsebool -P httpd_can_network_connect 1
chcon -R -h -t httpd_sys_script_rw_t /var/www/html/wordpress

WordPress のセットアップ

ブラウザからサーバーIPの /wp-admin/install.php にアクセスしてください。例えば、ドメインexample.com だとURLは https://example.com/wp-admin/install.php です。

アクセスすると、このような画面が表示されます。

次に進んで、データベースの設定の画面では以下のようにMariaDB で設定したデーターベース名・ユーザー名・パスワードを指定します。
ここでエラーが出る方は、上記の設定をもう一度見直してみてください。

この記事の通りにしているならばデータベース名は wp_database、ユーザー名は wp_admin 、パスワードはMariaDBのところで wp_admin用パスワードを設定したと思うので、そのパスワードを入力してください。

正しくできれば、「インストールを実行」という画面が表示されます。続いてボタンをクリックしてください。

あとはサイトのタイトルと管理者のユーザーを作って「Wordpressをインストール」押せば設定は完了です。

成功したら「ログイン」を押すとログイン画面に移動するので、先ほど作った管理者用のユーザーでログインしてください。

これでインストール完了です。

終わりに

以上でインストール完了ですが、現状ではWordpressを動かすのに必要最低限の設定しか行っていません。ので今後nginx の設定も書いていきたいです。