CentOS Stream8でセキュアにLinuxユーザー作成、LAMP構築【その1】

コノハVPSにて、CentOS Stream8(EOL 2024-05-31)でLAMPを作ります。最初にLinuxの管理者ユーザー作成、rootユーザーSSH接続の封印、ドキュメントルートのアプリケーションのファイル編集者用にLinuxの一般ユーザーを作成します。Linuxのユーザーをなるべくセキュアに設計しましょう。その後でLAMPを作ります。CentOS Stream8を接続許可ポートでWEBとSSHのみで仮想マシンを起動、VPSの仮想マシンにターミナルやTeratermやgitbashなどのシェルにてrootユーザーでSSH接続してください。尚、手元のローカルPCはWindows10 Proです。【その2】以降で、Let’sEncryptのSSL、Basic認証、Apacheログローテーション、MySQLログローテーション、Laravel、node.js、git/github、CircleCI、そしてローカル開発環境のDocker構築までセットアップしていく予定です。AWSを使いたいところですが、料金がお高いのでVPSになりました・・・。

gitbashでSSH接続する

ssh -i ローカルWindows10Proのroot秘密鍵フルパス root@IPアドレス

Linuxユーザー作成

rootユーザーでLinux更新

yum -y update

Linux管理者ユーザー、adminconoha をrootユーザーで作ります。最終的にrootユーザーのSSH接続を封印し、adminconoha がrootに成れる唯一の管理者権限のLinuxユーザーになるようにします。

adduser adminconoha

adminconohaのパスワードを設定します。

passwd adminconoha

この状態でrootユーザーのSSHをログアウトして、adminconohaでSSHのパスワード接続は出来ませんでした。

/etc/ssh/sshd_config の69・70行目を確認すると、SSHのパスワード認証出来ない設定になっています。ここは変えません。

#PermitEmptyPasswords no
PasswordAuthentication no

rootユーザーでadminconohaをwheelグループに追加します。

usermod -G wheel adminconoha

Linuxユーザーadminconoha用のキーペアを手元のローカルPCで作ります。この作業は仮想マシンではなく手元のローカルPCの任意のディレクトリで次のコマンドを実行し、キーペアを作ります。

ssh-keygen -t rsa -b 4096 -C "メールアドレス"

キーペアが出来たら、以下のように仮想マシンに手元のローカルPCで作った.pubの公開鍵登録をadminconohaで仮想マシンに対して行います。最後のviコマンドで手元のローカルPCに作った.pubの公開鍵を貼り付けて保存してください。

su adminconoha
cd
mkdir .ssh
chmod 700 .ssh
touch .ssh/authorized_keys
chmod 600 .ssh/authorized_keys
vi ~/.ssh/authorized_keys

adminconohaのSSH接続が出来ることを確認します

ssh -i ローカルWindows10Proのadminconoha秘密鍵フルパス adminconoha@IPアドレス

adminconohaはrootに成れることも確認します。

sudo su -

rootユーザーで、SSH接続出来ないように /etc/ssh/sshd_config を書き換えます。

vi /etc/ssh/sshd_config

PermitRootLogin no のように書き換えます。以後、Linuxのrootユーザーを使いたい場合、adminconohaでsudo su – を行ってください。

#PermitRootLogin yes
PermitRootLogin no

rootユーザーでコノハVPSの仮想マシンにSSH接続できないことを確認出来たら、Linux管理者ユーザーadminconohaの作成完了です。

Linux一般ユーザーconohaを、adminconohaでコノハVPSの仮想マシンにSSH接続して、root成りしてから作ります。

adduser conoha
passwd conoha

Linuxユーザーconoha用のキーペアを手元のローカルPCで作ります。この作業は仮想マシンではなく手元のローカルPCの任意のディレクトリで次のコマンドを実行し、キーペアを作ります。githubやCircleCIなどを見越してキーはパスフレーズ無しで作成します。

ssh-keygen -t rsa -b 4096 -C "メールアドレス"

手元のローカルPCで作った.pubの公開鍵登録をLinuxユーザーconohaで仮想マシンに対して行います。最後のviコマンドで手元のローカルPCに作った.pubの公開鍵を貼り付けて保存してください。

su conoha
cd
mkdir .ssh
chmod 700 .ssh
touch .ssh/authorized_keys
chmod 600 .ssh/authorized_keys
vi ~/.ssh/authorized_keys

conohaのSSH接続が出来ることを確認します

ssh -i ローカルWindows10Proのconoha秘密鍵フルパス conoha@IPアドレス

以上でLinux一般ユーザーconohaの作成は終わりです。

もっとセキュアにLinuxユーザーを構成したい場合、LAMP開発で使うLinuxユーザーとgthub/CircleCIで使うデプロイ用のLinuxユーザーをつくり、デプロイ用のLinuxユーザーのみパスフレーズ無しにするといいです。

LAMP構築

Apache,MySQL,phpなどを仮想マシンにインストールします。

Apache2.4をインストール

adminconohaユーザーでrootに成って以下のコマンド実行

yum install httpd

Apache起動

systemctl start httpd.service

Apache自動起動設定

systemctl enable httpd

ファイヤーウォールの http 80ポート、https 443ポート を開ける(httpsだけにするべきですが・・・)

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

ファイヤーウォールの設定変更を反映させる

firewall-cmd --reload

httpd稼働確認

systemctl status httpd

MySQLインストール

MySQLインストール前にMariaDBの存在有無と削除をしておいたほうがいいかもです。

adminconohaユーザーでrootに成って以下のコマンド実行

yum install mysql-server

MySQL起動

systemctl start mysqld

MySQL自動起動設定

systemctl enable mysqld

MySQLの初期設定

mysql_secure_installation

MySQLにログインしてみる

mysql -u root -p

MySQLデータベース一覧確認

show databases;

MySQLモニタを終了

quit

MySQLバージョン確認

mysql --version

phpインストール

adminconohaユーザーでrootに成って以下のコマンド実行

php7.2をインストール

yum install -y php php-mysqlnd
systemctl restart httpd

php7.2から7.4へupgrade

pkgs=`rpm -qa --queryformat "[%{NAME}\n]" | grep php | sort`
dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
dnf module list php
dnf module reset php
dnf module enable php:remi-7.4
dnf install $pkgs

php7.4を確認するためにindex.phpを作ります。

vi /var/www/html/index.php

index.phpの中に以下を記載

<?php phpinfo();

IPアドレスをブラウザのURLに打ち込んで、phpinfoのApache画面を見られるか?確認してください。

Apache2.4のバーチャルホスト設定

以下のやり方で1つのApache2.4のWEBサーバーに複数独自ドメインのホスティングが出来ます。

/etc/httpd/conf/httpd.confにて 独自ドメインのServerNameをListen 80の下に追加

#Listen 12.34.56.78:80
Listen 80
ServerName 独自ドメイン:80

バーチャルホストの/etc/httpd/conf.d/独自ドメイン_http.confを作る。バーチャルホストまわりのパス構成や命名ルールは慎重に検討されることをおすすめします。Let’sEncryptかつ複数バーチャルホストの交通整理や命名の規則性がきれいなためです。

vi /etc/httpd/conf.d/独自ドメイン_http.conf

独自ドメイン_http.confの中身は以下のような感じで作る。上部のバーチャルホストは、http://IPアドレス によるブラウジングで403を返す設定です。下部のバーチャルホストのRequire all grantedは全てのアクセスを許可するとなります。

<VirtualHost *:80>
    ServerName any
  <Location />
    Require all denied
  </Location>
</VirtualHost>

<VirtualHost *:80>
  ServerName 独自ドメイン
  ServerAlias www.独自ドメイン
  DirectoryIndex index.php index.html index.htm
  AddDefaultCharset UTF-8
  DocumentRoot /var/www/独自ドメイン/DocumentRoot
  ErrorLog /var/www/独自ドメイン/logs/独自ドメイン-error_log
  CustomLog /var/www/独自ドメイン/logs/独自ドメイン-access_log common
  <Directory "/var/www/独自ドメイン/DocumentRoot/">
    Require all granted
  </Directory>
</VirtualHost>

上記設定を終えたら、/var/www/独自ドメイン/DocumentRoot/index.php を作る

vi /var/www/独自ドメイン/DocumentRoot/index.php

index.phpの中身は、とりあえず、phpinfoで

<?php phpinfo();

/var/www/独自ドメイン/logs も作る

mkdir /var/www/独自ドメイン/logs

Apacheの起動とリロードと文法テストとステータス確認

systemctl start httpd
systemctl reload httpd
service httpd configtest
systemctl status httpd

ドキュメントルート内のファイル編集の権利を一般ユーザーconohaに与える。一般ユーザーconohaをLaravelやTypeScriptなどのアプリ開発のエンジニア領域として切り出します。

chown -R conoha:conoha /var/www/独自ドメイン/DocumentRoot

バーチャルホストのパス構成の理由として、ディレクトリトラバーサルの話は、一旦、放置して、

  • /var/www/独自ドメイン ではhttp/httpsリクエストに対し非公開のファイルを配置
  • /var/www/独自ドメイン/DocumentRoot ではhttp/httpsリクエストに対して公開のファイルを配置したり、後にgitリポジトリ化

するためです。

次回は、CentOS Stream8でセキュアにLinuxユーザー作成、LAMP構築【その2】 となります。Laravel8、Let’sEncryptのSSL(certbot)、Basic認証、Apacheログローテーション、MySQLログローテーション、node.js、git/github、CircleCI、そしてローカル開発環境のDocker構築などの予定です。Laravel8は、Apacheバーチャルホストの公開ディレクトリの変更が必要となるため、certbotによるSSL証明書取得の前にかならず行ってください。

コメントをいただくことがしばしばあるため、コメント機能を有効化しました。わからないこと、間違っていること、疑問に思うこと、何でも質問受け付けます。間違っていることは適宜修正させていただきます。お気軽にコメントください。また、正しい回答を出来る方は、正しい回答でぶった斬ってコメントいただけますと幸いです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください