Apache 2.4 で少しセキュアなWebサーバを構築する。

1.はじめに

CentOS 7ではApache 2.4がデフォルトになっていますが、2.2の頃に比べて設定が簡素になっていて、逆に解り難くなっている感じもします。

また、多くのサイトでは基本的な設定は記載されているのですが、セキュリティを考えたり、マルチドメインに対応させたり、高速化を考えたり。。。意外と面倒なんですよね。

そこで、自分用にサイトをカスタマイズしてみました。
ということで、個人用設定です。

2.こんな感じにしよう

お品書きです。

・Apacheのインストール
・VirtualHostの設定
・SSL対応(紹介のみ)
・基本的なセキュリティ設定
・ちょっと踏み込んだセキュリティ設定
・高速化

こんな感じで進めていこうと思います。
SSL対応の前にVirtualHostの設定を行う理由は、今回使用するSSLの証明書がドメイン毎に必要となる為、事前にマルチドメインの設定を行っておきたかったためです。
順序についても少し考えてから行ってみると、作業が戻らなくて良いかと思います。

3.Apacheのインストール

CentOS 7ではデフォルトで準備されている場合もありますね。
もし入っていなかった場合には、yumでインストールしましょう。

あまりに簡単すぎますが、インストール自体はこれで終わりです。
以下のFirewall設定を行えば、公開出来てしまいます。

3.1 firewallの設定

上記のコマンドでは、httpとhttpsを開放しています。
実際には、まだhttpsの設定は行っていませんので接続は出来ません。
試しに、httpでドメインを指定してアクセスしてみましょう。
きちんとApacheのロゴが表示されるでしょう。

3.2 VirtualHostの設定

複数ドメインでWebサーバを構築したい場合があります。
そこで、複数ドメインでWebサーバが動くように設定を行います。
/etc/httpd/conf.dに新たな設定ファイルを追加します。
/etc/httpd/conf.d/virtual.confとします。

上記では、hoge.ne.jpとsub.hoge.ne.jpで指定する2つのドメインでアクセスできるようになりました。

4.SSL対応(紹介のみ)

Let’s Encryptを利用すると、無償でSSL証明書を得ることが出来ます。
下記のサイトにインストール方法が記されていますので参考にされると良いでしょう。
https://free-ssl.jp/usage/install-certbot.html#CentOS7

実行方法についても同じ様に下記のサイトに記されています。
https://free-ssl.jp/usage/#TestExec

コマンドを実行されたら内容を確認しながらインストールすると、 /etc/httpd/conf.d/virtual.conf も適当に書き換えられて、SSL対応が可能になります。
こんな感じに書き換えられます。

httpdを再起動するとSSLの設定が有効になります。

5.基本的なセキュリティ設定

これから幾つかの設定を行います。
設定を行った際に行う2つのことをここで説明しておきます。
1つ目は、正しき記載されているか?
2つ目は、httpdの再起動です。
それぞれ、よく使うコマンドになりますので以下に記します。

正しく記載されているか確認します。

httpdの再起動を行います。

5.1 Wellcomeページの削除

デフォルト状態でドメインへアクセスすると、Welcomeページが表示されます。
Welcomeページは通常不要なページです。
必要ないから削除してしまいましょう。

/etc/httpd/conf.d/welcom.confファイルを削除するかリネームすることでwelcomぺ^自我表示されなくなります。

httpdを再起動することで設定は反映されます。

5.2 Index表示をデフォルトで行わせない。

デフォルトの設定では、URLで指定されるフォルダーの一覧が表示される状態になっています。
フォルダーの一覧が表示されてしまうと、サイトに含まれるファイルの一覧や構造が解ってしまいます。
この機能をデフォルトでOFFにします。
/etc/httpd/conf/httpd.confに含まれる以下の設定を変更します。

5.3 HTTP TRACEメソッドを無効化する。

クロスサイトスクリプティングの対策として、TRACEメソッドを無効化します。
/etc/httpd/conf/httpd.confに以下の1行を追加します。

5.4 X-Frame-Options を設定する。

クリックジャッキングの対策として有効なX-Frame-Optionsを設定します。
/etc/httpd/conf/httpd.confに以下の1行を追加します。

SAMEORIGIN以外にもオプションはありますが、ブラウザによってサポートされていない場合もあります。
ブラウザのバージョンに依存することもあります。
ネット上で情報確認を行った上で対応を考えてみてください。
この設定を行うと、iframeなどで異なるドメインのサーバで勝手に使用されることが出来なくなります。

5.5 Apacheバージョンの隠ぺい

Apacheのバージョンをデフォルトでは取得できる設定になっています。
でも、バージョン情報が解ってしまうと、そのバージョンを狙った攻撃も解ってしまいます。
そこで、このバージョン情報を隠ぺいします。
普通は必要ない情報ですからいいでしょう。
/etc/httpd/conf/httpd.confに以下を追加します。

5.6 暗号化を強化する。

まず、安全性の低い暗号化を無効にします。
/etc/httpd/conf.d/ssl.confにある以下の内容を変更します。

次に、以下を有効にします。

CentOS 8:postgreSQL 12 + Python

前回のpostgreSQLインストールでドタバタしたのも束の間、psycopg2がインストール出来ない!?

postgreSQL 12のインストールは前回を参考にしてください。

pg_configが使えない?

それでもだめなので、.bashrcにパスを追加

それでも、gccが無いと怒られたので

 これでもか!ということで

最後良く分からないけど、なんかできた!

CentOS 8 にpostgreSQL 12を入れる!postGIS 3.0も入れる!やばかった~(TT)

#なんか文字フォントが変わっている気がするけど、気にしない。

さて、CentOS 8にpostgreSQL 12.xをインストールしようと思い立ちました。

インストールばっかりしているけど、きちんと使ってるんですけどね。
使った結果を出すのが面倒なんですよね。
守秘義務とかあってですねぇ(^^;

ということで、インストール手順ですが、まずはリポジトリをインストールします。

で、何を入れるの?みたいな感じになったんですよ。
本家に行けば良かったです。以下のサイトに行ってみます。

https://www.postgresql.org/download/linux/redhat/

少し下の方にある項目に必要事項を入力します。

4番目の項目にdnfのコマンドが記されているので、それをコピーして実行するだけです。
こんな素晴らしいものがあったことを知りませんでした(TT)
ありがとう!!!と感謝しながら、続けます。
まずは、リポジトリの追加を行います。

ビルトインのpostgreSQLを無効にします。

postgreSQL 12をインストールします。

続いて、サーバをインストールします。

最後に、データベースの初期化を実施し、OS起動時における自動起動の設定を行います。(後でも大丈夫)

postgreSQLのデータベース保管場所を変更します。

デフォルトのままでも良いという方は読み飛ばしてください。

データベースが肥大化すると場所の移動が面倒になりますので、予め、どこか適当な場所にパーティションを切って移動しておくと楽です。
今回は、特にパーティションの設定にまでは言及しませんでしたが、OSインストール時に決められなった場合には、後々ストレージを増設することを想定した対応を行っておくと便利です。

今回は、/data/DBの下に作ることとしました。

サービスの変更を行いましたので、デーモンの設定をリロードしておきます。

以下のコマンドを実行してデータベース環境を初期化します。

問題なければこんな感じになるはずです。

# more /data/DB/PG_VERSION
12

postgreSQLを起動する準備です。

それと、データベースの場所を変更していますので、以下の設定を行います。

これで、postgreSQL 12の設定は完了です。
それでは、postgreSQLを起動してみます。

設定は完了しているので、rootユーザに戻り以下のコマンドを実行します。

確認します。

Active:active(running)となっていれば、正常に動作開始していますね。

postGISのインストール

postGISをインストールします。
postgreSQLのバージョンとpostGISのバージョンには、相関関係があります。
まずは、相関関係を確認します。

下記のURLで対応状況を確認します。

https://trac.osgeo.org/postgis/wiki/UsersWikiPostgreSQLPostGIS

対応表(抜粋)

見難い人は、直接上記URLで確認してください。
postgreSQL 12に対応したpostGISは2.5以降であることが判ります。

インストール対象を確認するために、一度リストを表示させてみます。

postgis30_12.x86_64が最新の状態で使えそうです。

インストールしてみます。

エラーがズラリと表示されました。
必要なパッケージがインストールされていないと怒られています。依存関係でクリアしてくれないみたいです。

そこで、それぞれ一つ一つインストールをクリアしようと思ったのですが、全く進みません。

半ば諦めてバージョンを戻そうかと悩んだんのですが、どうもそれでも上手く行かないみたいな話がちらほら・・・
CentOS 8を諦めるかどうしようか悩んでいたのですが、クリアしました!

これでどうじゃ!

多分これで行けます!
ダメだったら、libdapとかgdal30を–nablerepo=PowerToolsを追加して実行してからインストールしてみてください。

多分、これで行けたはず!
ダメだったら泣いてくださいm(__)m

CentOS 8 conflicting requests

CentOS 8.1911 をインストール後にアップデートを実施してからだと思うのですが、dnfを実行するとconflicting requestsと表示される様になりました。

対象モジュールをインストールしてみるも、既にインストールされていると言われる始末。

解決策が判らず困っていたところです。

以下のコマンドを実行することで解決しました。

単なるバグだな。

CentOS 8 インストール後にやったこと

定番ですが

毎度のことですが、CentOS を入れたら、まずyum updateをやりますよね。
今回は、CentOS 8なのでdnf使うだけですね。

アップデートは最初にやっておきましょう。

続いて、こちらも定番です。
EPELを使えるようにしておきましょう。

シェル周りも自分好みに合わせて

コマンド補完

コマンドライン上での文字補完を有効にします。

これで終わり。
次回ログイン時から有効になります。

CentOS 7までは別途インストールの必要がありましたが、bash-completionはデフォルトでインストールされていました。

aliasも少し変更

好みに合わせて変更します。
こんな感じの設定を追加します。

日本語フォント

うーん?ipaのフォントをインストールしようと思ったんだけど、見つからない。何故だろう。

課題にしておきます。

なんか入れるものがないので、おまけ

画面キャプチャとかした時に、画像を少し編集したいという時に使ったりするので、gimpを入れておきます。

Pythonは

「python」コマンドは存在せず、「python2」と「python3」がインストールされていました。
他にはこんな感じでインストールされていました。

python3のバージョンは、これ

なんかやることなくなっちゃった感じですが、インストール後の手間が少し楽になった気がします。

PostgreSQL & postGISインストール。

インストール手順ばかり記録してる気がする今日この頃・・・(TT)
もう少し、利用事例を記録しろと思っているのですが、ご勘弁をm(__)m

さて、今回も環境はCentOS 7です。
手抜きインストールをやってしまい(いつもですが・・・)、デフォルトのPostgreSQLを入れてしまいました。
ところが、postGISを使おうとして古くて使えないことに気が付き、今更ながら新しいPostgreSQLを入れることになり悩んでいたのですが、ほぼ最新版を既に入っているPostgreSQLが入った状態でインストールできるということで試してみます。
と言いつつ、実際には、PostgreSQLが入っていない環境へ適用します。

当初、PostgreSQLのインストール方法を探してみると、yumでデフォルトのリポジトリからインストールする方法は目に入ります。
バージョンが9.2と随分古いバージョンであることに気が付かずインストールしてしまったのが、今回の始まり。

出来るだけ最新版に近いバージョンをインストールしようと探してみると、12.1が最新で公開されていました。比較的最近になってからリリースされているので、情報が見つからない可能性があるかと思いながらも、探していると12.1のインストール方法はありました。

それでは始めます。

PostgreSQLとPostGISのインストール準備

定番ですが、epel-releaseをインストールしておきますね。
多分、これを使おうとしている方は、既にインストールされているのでは無いでしょうか?

RPMからインストールするとか、方法は幾つかあるようですが、後でメンテナンスしやすい、yumだけでインストールする方法を見つけました。

まず、CentOS SCLo Software Collectionのリポジトリを追加します。

後はひたすらyumでインストールするだけ!

ほとんど終わったw

CentOS 8 インストール!pane is daed !? で嵌った人も大丈夫!!

本記事に辿り着いた方に、本記事では、CentOSのインストールそのものに関する記載を行っておりません。
CentOS 8のインストールを実施しようとして、以下で説明する事象が原因でインストールが実施出来無い人向けの案内になります。
CentOS 8のインストールそのものは、従来のCentOS 7以前で行っていた要領と変わりはありません。

VMware Workstation Pro 1.5 にCentOS 8.1911をインストールしようとしています。
ダウンロードに相当な時間を費やして、やっとダウンロードが終わり、さてインストールしようと起動したところ以下の画面で終わりました。

Pane is dead

画面下の方に「Pane is dead」と表示されて終わっています。

海外のサイトには対策が書かれているのですが、実際面倒な感じです。
たまたま見掛けた資料で、これが手っ取り速く出来そうなので試してみました。

ついでなので、インストール手順から始めます。

まずは、公式サイトからISOイメージをダウンロードしておきます。
公式サイト:https://www.centos.org/

VMwareの画面上で、「New Virtual Machine Wizard」を選択し、インストール設定を進めます。

「Typical」でも「Custom」でもどちらでも良いのですが、今回は「Typical」で作業を進めます。

次の画面では特に変更をする必要がなければ、そのままNextで次へ進みます。

先程ダウンロードしたISOイメージを起動時に使用するよう指定します。

ここでユーザ名とパスワードを聞かれるのですが、実際意味はありません。
適当な名前とパスワードを入力しておけば良いようです。
(多分、使われません)

仮想マシンを管理するための名前と、そのファイルを指定します。
ご自身の環境に合わせて記載してください。

仮想マシンに割当てるCPUコアを指定します。コアの数と同時実行のスレッド数を指定するようなイメージですね。Total processor coresが仮想CPU数と考えるとしっくりくる感じですね。

仮想マシンに割当てるメモリ容量を指定します。
最初なので、2GBを指定していますが、後で変更することが可能です。

ネットワークアダプタの設定をしています。
通常のPCだと、物理的なソケット(LANコネクタ)の数は1つだと思いますが、仮想OSが使用する場合、そのソケットをどういう風に繋ぐかを決める必要があります。
VMwareでは、仮想OSにも独自のIPアドレスを与え、且つ、外部とのインタフェースも実現しようとする場合、ブリッジ接続が良いようです。

VMwareのネットワーク設定にはいろいろとあるので、それは別途調べてみると良いでしょう。ここでは、省略します。

ストレージの接続をしてしています。
あまり気にせずに設定しました。

こちらも同様です。オススメに従いました。

仮想マシンを複数のファイルで構成するか、それとも1つのファイルで構成するかを問われています。

用途に依って違いがあると思いますが、シンプルにシングルファイルで構成することにしています。

仮想マシンのファイル名を指定しています。
適当に指定すれば良いでしょう。

最終確認です。間違いがなければ続行しましょう。

起動が開始されインストーラが起動します。

ガーーーーン!
止まってしまいました。
多分、ここを訪れる多くの方はこの問題に捕まったのではないでしょうか?
インストールなんて、インストーラ起動したら後はどうにでもなりますからね(TT)

同士の皆さん、ここからです!

本ページの最初でもお伝えしたように、「Pane is dead」と表示されて画面が固まっています。ここから先に進むことが出来ません。

この問題に引っ掛る方は、VMwareのユーザに限定される可能性が高いです。
実際、VirtualBoxや実際のマシン(Phisycal Machine)では発生していないはずです。

初期段階で設定を変更出来たのかも知れませんが、ここで一度パワーOFFをします。

Pane is dead

VMwareの画面で、「Edit virtual machine settings」を開き、設定変更を行います。

「CD/DVD」が2つ登録されていることが分かります。

この不要な「CD/DVD」が悪さを引き起こしている原因です。
こいつを削除します。

再起動してみましょう。

出ました!CentOS 8のインストーラを起動させるための画面が表示されました!!

後は、従来通りにインストールを進めるだけです。
CentOS 7以前のインストールを体験されている方であれば、何等の変更も無いように感じるでしょう。

ということで、以下省略します!

ISOイメージのダウンロードを速くしたい!

OSのISOイメージとかダウンロードしようとして、5時間とか6時間とか・・・えぇ~!今日インストールしたいんだけど!!!!!!

そんな経験ありますよね。

今回は、CentOS 8のISOイメージをダウンロードしようと思ったのですが、そんな状況に陥りました。

なんかあるよね・・・とググると、やはりありました!
aria2を使うと劇速!

あちらこちらのミラーサイトを試してみていたのですが、wgetだと5~6時間くらい掛かる感じです。
今までは、回線が細いからダメなんだろうな。。。とか思っていたのですが、そうでもないみたいな感じ。

CentOS 7.1908は4.3GBだったのに、CentOS 8.1.1911では7.0GBと大幅ボリュームアップ!
普通に買い物する時ならボリュームアップは大歓迎なのですが、増えて困るのがダウンロードサイズ(TT)

以前、知り合いから超ドデカいファイルをダウンロードしたいんだけど、なんかやり方無いだろうか?と聞かれて、調べたことがあったのを思い出しまして、調べた結果がこいつです。

aria2は標準でインストールされていないようなので、インストールします。

これで準備完了です。

いきなりですが、こんな感じでダウンロードしてみました。

# aria2c -x10 -s10 -k1M http://mirrors.cat.net/centos/8.1.1911/isos/x86_64/CentOS-8.1.1911-x86_64-dvd1.iso http://ftp.riken.jp/Linux/centos/8.1.1911/isos/x86_64/CentOS-8.1.1911-x86_64-dvd1.iso http://ftp.tsukuba.wide.ad.jp/Linux/centos/8.1.1911/isos/x86_64/CentOS-8.1.1911-x86_64-dvd1.iso http://ftp.jaist.ac.jp/pub/Linux/CentOS/8.1.1911/isos/x86_64/CentOS-8.1.1911-x86_64-dvd1.iso http://ftp.yz.yamagata-u.ac.jp/pub/linux/centos/8.1.1911/isos/x86_64/CentOS-8.1.1911-x86_64-dvd1.iso http://ftp.nara.wide.ad.jp/pub/Linux/centos/8.1.1911/isos/x86_64/CentOS-8.1.1911-x86_64-dvd1.iso http://ty1.mirror.newmediaexpress.com/centos/8.1.1911/isos/x86_64/CentOS-8.1.1911-x86_64-dvd1.iso http://ftp-srv2.kddilabs.jp/Linux/packages/CentOS/8.1.1911/isos/x86_64/CentOS-8.1.1911-x86_64-dvd1.iso http://mirror.fairway.ne.jp/centos/8.1.1911/isos/x86_64/CentOS-8.1.1911-x86_64-dvd1.iso http://ftp.iij.ad.jp/pub/linux/centos/8.1.1911/isos/x86_64/CentOS-8.1.1911-x86_64-dvd1.iso

オプションの説明は、–helpで調べてみてください。

回線が細いこともあり30分弱でダウンロードしましたが、回線が太ければもっと速くダウンロード出来るかも知れません。

ビックデータのダウンロードとかでも使えそうなので、今後の参考にしたいと思います。

ffmpeg 複数インタフェースカードの対応

複数のNICが搭載されたサーバマシンで、マルチキャストで配信されているストリーミング映像を受信しようとして、ガッツリと嵌りました。

環境

環境は以下の感じです。

マシン環境

OSCentOS 7.7.1908
NIC5枚 (利用したのは2枚だけ)
eth0〜eth5がある状態でeth0とeth1だけ使用。
(「eth?」は環境によって違うので適当に読み替えてください。)

ネットワーク

ネットワーク環境について説明する。
今回の環境では、ネットワーク1とネットワーク2がある。
ネットワーク1は、インターネットなど外部環境と接続している。
ネットワーク2は、マルチキャストで映像配信が行われており、その映像をキャプチャし、映像処理を施した後にネットワーク1側で提供する。

課題になった現象

今回、課題になった現象は、eth0側の通信は出来るのだが、eth1側からffmpegによる映像キャプチャが出来ないという現象が発生した。

色々と調べてみたのだが、eth1側のマルチキャストをルーティングにテーブルに設定することでキャプチャが可能になるように記載があちらこちらで見受けられたのだが、実際にはそれだけではダメだった。

解決策

このままのネットワーク構成でも実現できる可能性はあったが、結局は、eth0側のデフォルトゲートウェイによりマルチキャストの受信を行おうとしいて受信できない状態になっていると理解した。

そこで、eth0とeth1を入れ替えた。

ここでも問題が生じた。
新たにeth0となったネットワーク2側のデフォルトゲートウェイにより、外部との通信が遮断されてしまったのだ。
外部のアドレスは不特定なため、簡単にルーティングテーブルを指定することが困難であると判断し困惑した。

問題は、本来、ネットワーク1側のゲートウェイを介して外部に接続しなければならないのにも関わらず、ネットワーク2側のゲートウェイで捕捉されてしまい、ネットワーク1側に流れないということと判断した。

そこで、ネットワーク2側のデフォルトゲートウェイの設定を削除した。

次に行ったことは、ルーティングテーブルに224.0.0.0/4を登録した。

ここでも嵌った!

ドキュメントでは、/etc/sysconfig/network-script/route-eth0に以下の様に記述する方法があり、ネット上でもその記載方法が記されていた。

T.B.D

しかしながら、その設定ではなく、別の方法による記述が求められた。

ちなみに、ip routeコマンドでルーティングを/etc/rc.localに記載したのだが、起動時にコマンドを実行しても、ルーティングテーブルを確認すると設定が行われていない状況であった。

GUIを用いて、以下のルートを指定した。
<<<<現状はメモ状態なので、近日中に更新予定>>>>

224.0.0.0/4 ゲートウェイは0.0.0.0

これで上手く通信が出来るようになった。

以上でも問題解決が出来た。
ffmpeg自体はNICの指定が出来ないことから、無理やりするには色々と課題があるようだ。
環境を構築して、確認を行うことをお勧めする。

ファイルやディレクトリの変更をトリガーにしてプログラムを起動する。incronがダメなら、inotifyで!

ファイルやディレクトリを監視したい!

ここでも過去に取り上げていますが、incronを用いて任意に指定するファイルやディレクトリの更新を監視することが出来ます。
ところが、incronは何度かバグが発生し、且つ、メンテナンスが遅れ遅れになっていることもあり、利用することを断念しました。

systemdでサポートされているinotifyを利用する手段が次に出てきた訳ですが、当初は情報も少なくて困ったものです(^^ゞ

というところで、CentOS 7上のPython 3で利用できるか確認してみました。

結論としては、Python 2.xと比較して、ほぼデフォルト状態のPython 3で利用することが出来ました。

どんなイベントを監視できるのか?

いろんなイベントを監視できるので、詳細についてはmanで確認できます。

サンプルコード

ここで示すサンプルコードでは、指定したディレクトリ内に含まれるファイルもしくはディレクトリ移動した場合にイベントが発生します。

サンプルコードを以下に記します。

maskにpyinotify.IN_MOVED_TOを指定することで、ファイル/ディレクトリの移動を監視しています。
IN_MOVED_TOをIN_CREATEにすれば、ファイル/ディレクトリが生成されたタイミングでイベントが発生します。
ディレクトリを指定した場合には、対象ディレクトリ以下のサブディレクトリも監視対象となります。
ただし、監視中(プログラム起動後)に新たに設置されたフォルダー内部は監視対象にならないということに注意が必要です。
syslogにログを残す機能も併せて盛り込んでしまいました。

意外と簡単ですよね。