ホームページ CMS

ユーザーディレクトリをWEBで公開する 共用レンタルサーバー仕様設定 public_html

ホームページ CMS

システム開発 CMS ホームページ作成

■共用レンタルサーバー仕様にするシステム

 

アメブロなどブログサービスのようにユーザーに貸し出す場合です。
自社でブログサービス感覚で誰でも使えるシンプルな機能のCMSを作って
スタートアップ企業さんに提供していく
プロジェクトが始まったのでサーバーをこしらえました。

概要

具体的には以下のオリジナルコマンドでユーザーを追加

[bash] # chroot-share-useradd testuser
[/bash]

※削除する場合は

[bash] # chroot-share-userdel testuser
[/bash]

 

この作成されたtestuserは

 

・ftp通信でのアップロードが可能
・public_htmlにindex.htmlをアップロードすればWEBに反映
・MySQLデータベースも作る
・パスワードはランダムで自動生成を行いたい。

 

 

http://ドメイン名/testuser/
or
http://ドメイン名/testuser/index.html

でWEBの閲覧ができるようにする。

 

※scpがあるのだからftpの使用は控えたいものの
※WEB作成ソフトがsftpをサポートしていなかったりして
※ftpの要望ががが(˚ ˃̣̣̥᷄ω˂̣̣̥᷅ )

chrootユーザーのpublic_htmlにアクセスする為の設定を行います。

【Apacheの設定ファイル編集】

 

 

# vi /etc/httpd/conf/httpd.conf
#
# UserDir is disabled by default since it can confirm the presence
# of a username on the system (depending on home directory
# permissions).
#
UserDir disabled

#
# To enable requests to /~user/ to serve the user’s public_html
# directory, remove the “UserDir disabled” line above, and uncomment
# the following line instead:
#
#UserDir public_html

 

↓変更
#
# UserDir is disabled by default since it can confirm the presence
# of a username on the system (depending on home directory
# permissions).
#
UserDir disable

#UserDir disable ← #を追加(コメントアウト)

#
# To enable requests to /~user/ to serve the user’s public_html
# directory, remove the “UserDir disable” line above, and uncomment
# the following line instead:
#
#UserDir public_html

UserDir public_html ← 行頭の#を削除(コメント解除)

 

AliasMatch ^/testuser(.*) /home/testuser/public_html/$1 ←testuserユーザーのみhttp://sysgcms.com/~testuser/のように~でアクセスできるようにする場合

 

AliasMatch ^/([^/]+)/(.*) /home/$1/public_html/$2←全てのユーザーでhttp://sysgcms.com/userdir/ユーザー名/でアクセスできるようにする場合

 

#
# Control access to UserDir directories. The following is an example
# for a site where these directories are restricted to read-only.
#
#
# AllowOverride FileInfo AuthConfig Limit
# Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
# # Order allow,deny
# Allow from all
# # # Order deny,allow
# Deny from all
# #

 

※以下を追加します。
<Directory /home/*/public_html>
AllowOverride All
Options IncludesNoExec ExecCGI FollowSymLinks
<Limit GET POST OPTIONS>
Order allow,deny
Allow from all
</Limit>
<LimitExcept GET POST OPTIONS>
Order deny,allow
Deny from all
</LimitExcept>
</Directory>

 

 

[bash] [root@sysgcms yuu]# service httpd restart
httpd を停止中: [ OK ] httpd を起動中: [ OK ] [/bash]

 

 

 

 

 

※WEBサーバーのエラーメッセージについて

 

httpd を起動中: [Fri Dec 05 16:40:17 2014] [warn] The Alias directive in /etc/httpd/conf/httpd.conf at line 566 will probably never match because it overlaps an earlier AliasMatch.

※エラーが起こる場合はUserDirディレクティブを無効にして
最終行に以下を貼り付ける、または最終行に移動させる。

 

 

 

#
# UserDir: The name of the directory that is appended onto a user’s home
# directory if a ~user request is received.
#
# The path to the end user account ‘public_html’ directory must be
# accessible to the webserver userid. This usually means that ~userid
# must have permissions of 711, ~userid/public_html must have permissions
# of 755, and documents contained therein must be world-readable.
# Otherwise, the client will only receive a “403 Forbidden” message.
#
# See also: http://httpd.apache.org/docs/misc/FAQ.html#forbidden
#
<IfModule mod_userdir.c>
#
# UserDir is disabled by default since it can confirm the presence
# of a username on the system (depending on home directory
# permissions).
#
#UserDir disabled #
# To enable requests to /~user/ to serve the user’s public_html
# directory, remove the “UserDir disabled” line above, and uncomment
# the following line instead:
#
#UserDir public_html
AliasMatch ^/([^/]+)/(.*) /home/$1/public_html/$2
</IfModule>

#
# Control access to UserDir directories. The following is an example
# for a site where these directories are restricted to read-only.
#
#<Directory /home/*/public_html>
# AllowOverride FileInfo AuthConfig Limit
# Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
# <Limit GET POST OPTIONS>
# Order allow,deny
# Allow from all
# </Limit>
# <LimitExcept GET POST OPTIONS>
# Order deny,allow
# Deny from all
# </LimitExcept>
#</Directory> <Directory /home/*/public_html>
AllowOverride All
Options IncludesNoExec ExecCGI FollowSymLinks
<Limit GET POST OPTIONS>
Order allow,deny
Allow from all
</Limit>
<LimitExcept GET POST OPTIONS>
Order deny,allow
Deny from all
</LimitExcept>
</Directory>

 

【設定を反映させます。】

[bash] # service httpd restart
[/bash]

chroot共用ユーザ作成スクリプト作成

vstpd接続ができます。

mkpasswdコマンドを使いたいので
[bash] # yum install expect
[/bash]

expectのインストールが必要です。

[bash] # vi /bin/chroot-share-useradd
[/bash] [bash] #!/bin/bash
#
# Usage: ./chroot-share-useradd username [shell] #

###################################
#MySQLのrootパスワードを設定
MYSQLPASSWORD=MySQLのrootパスワード
###################################

## Here specify the apps you want into the enviroment
#CMD=”bash ls touch mkdir cp mv rm pwd chmod cat vi id rsync ssh scp sftp ping ssh-keygen perl”
#APPS=which $CMD
#APPS=”${APPS} /usr/libexec/openssh/sftp-server”

# Sanity check
if [ “$1” = “” ] ; then
echo ” Usage: ./chroot-useradd username [shell]”
exit 1
fi

# 追加するユーザー名を第1引数から取得して変数に代入
CHROOT_USERNAME=$1

#同名ユーザーがいたらスクリプトを停止させる。
if grep /etc/passwd -e “^$CHROOT_USERNAME” > /dev/null 2>&1 ; then
echo “There is already the same name of user”
exit
fi

if [ “$2” = “” ] ; then
useradd -s /sbin/nologin $CHROOT_USERNAME
else
useradd -s /sbin/nologin $2 $CHROOT_USERNAME
fi

# SSHログインのchroot設定
usermod -d /home/$CHROOT_USERNAME/./ $CHROOT_USERNAME

# 乱数でパスワードを自動設定する(長さ20文字、数字の数5、大文字3つ、記号なし)
PASSWORD=/usr/bin/mkpasswd -l 20 -d 5 -C 3 -s 0
#作成したパスワードをmd5でエンコードしてパスワードを設定する。
md5BASEPASS=/usr/bin/openssl passwd -1 ${PASSWORD}
/usr/sbin/usermod -p $md5BASEPASS $CHROOT_USERNAME
echo “ユーザー名:$CHROOT_USERNAME パスワード:$PASSWORD”

## パスワード設定を3回(default)ミスしたら作成したユーザーを消してスクリプト緊急停止。
#passwd $CHROOT_USERNAME
#if [ $? = 1 ] ; then
# chroot-share-userdel $CHROOT_USERNAME
# exit 1
#fi

chown $CHROOT_USERNAME /home/$CHROOT_USERNAME
chgrp $CHROOT_USERNAME /home/$CHROOT_USERNAME
rm -f /home/$CHROOT_USERNAME/.* > /dev/null 2>&1
#HOMEDIR=grep /etc/passwd -e "^$CHROOT_USERNAME" | cut -d':' -f 6
HOMEDIR=/home/$CHROOT_USERNAME/
cd $HOMEDIR

## Copy the apps and the related libs
#for prog in $APPS;
#do
# cp $prog ./$prog
# # obtain a list of related libraryes
# ldd $prog > /dev/null
# if [ “$?” = 0 ] ; then
# LIBS=ldd $prog | awk '{ print $3 }'
# for l in $LIBS;
# do
# mkdir -p ./dirname $l > /dev/null 2>&1
# cp $l ./$l > /dev/null 2>&1
# done
# fi
#done

#vsftpdサーバに追加します。
#sftpが入っているので、vsftpdを使わないなら必要ないです。
# vsftpdユーザー内に登録ユーザーが存在していなければ登録する。
if ! grep -q $CHROOT_USERNAME /etc/vsftpd/user_list; then
echo $CHROOT_USERNAME >> /etc/vsftpd/user_list
fi
#設定反映
/etc/rc.d/init.d/vsftpd reload

# public_html作成
if [ ! -d /home/$CHROOT_USERNAME/public_html ] then
mkdir /home/$CHROOT_USERNAME/public_html
chmod 755 /home/$CHROOT_USERNAME/public_html
fi

#public_htmlがWEBで公開出来るようにする
chmod 711 /home/$CHROOT_USERNAME
chmod 755 /home/$CHROOT_USERNAME/public_html

#不要なメールディレクトリを削除する
rm -rf /home/$CHROOT_USERNAME/Maildir
rm -rf /home/$CHROOT_USERNAME/var/spool/mail/$CHROOT_USERNAME

#MySQL DB作成
echo “DBを作成します。”
mysql -uroot -p$MYSQLPASSWORD -e “set password for $CHROOT_USERNAME@localhost=password(‘$PASSWORD’);”
mysql -uroot -p$MYSQLPASSWORD -e “create database $CHROOT_USERNAME;”
mysql -uroot -p$MYSQLPASSWORD -e “grant all privileges on $CHROOT_USERNAME.* to $CHROOT_USERNAME@localhost identified by ‘$PASSWORD’;”

echo “DB名:$CHROOT_USERNAME DBパスワード:$PASSWORD”
echo “正常にデータベースが作成されました。”

exit 0
[/bash]

【chrootユーザ環境作成スクリプトに実行権限付加】

[bash] [root@sysgcms ~]# chmod u+x /bin/chroot-share-useradd
[/bash]


【chrootユーザ作成する】

[bash] # chroot-share-useradd testuser
[/bash]

chrootユーザ削除スクリプト作成

よくあるyes or no の対話型にしました。

[bash] # vi /sbin/chroot-share-userdel
[/bash] [bash] #!/bin/bash

CHROOT_USERNAME=$1

echo $CHROOT_USERNAME” を削除してよろしいですか? [Y/n]”
read ANSWER

case $ANSWER in
“” | “Y” | “y” | “yes” | “Yes” | “YES” )
userdel -r $CHROOT_USERNAME > /dev/null 2>&1
rm -rf /home/$CHROOT_USERNAME
sed -i “/^$CHROOT_USERNAME$/d” /etc/vsftpd/user_list;;
* ) echo “NO!!”;;
esac

#MySQLのデータベースがあれば削除
echo “show databases;” | mysql -u root -p > chroot-userDB.txt
if grep chroot-userDB.txt -e “^$CHROOT_USERNAME” ;then
echo “drop database $CHROOT_USERNAME;” | mysql -u root -p
echo “DB名:$CHROOT_USERNAME を削除しました。”
fi
rm -f chroot-userDB.txt
[/bash]

→汎用性を考えると対話式は必要ありませんでした。
改めて。

[bash] #!/bin/bash
#
# Usage: ./chroot-share-useradd username [削除するユーザー名] #

###################################
#MySQLのrootパスワードを設定
MYSQLPASSWORD=MySQLのrootパスワード
###################################

#引数のユーザー名
CHROOT_USERNAME=$1

userdel -r $CHROOT_USERNAME > /dev/null 2>&1
rm -rf /home/$CHROOT_USERNAME
sed -i “/^$CHROOT_USERNAME$/d” /etc/vsftpd/user_list
echo “ユーザー名:$CHROOT_USERNAME を削除しました。”

#MySQLのデータベースがあれば削除
mysql -uroot -p$MYSQLPASSWORD -e “show databases;” > chroot-userDB.txt
if grep chroot-userDB.txt -e “^$CHROOT_USERNAME” ;then
#echo “drop database $CHROOT_USERNAME;” | mysql -u root -p
mysql -uroot -p$MYSQLPASSWORD -e “drop database $CHROOT_USERNAME;”
echo “DB名:$CHROOT_USERNAME を削除しました。”
fi
rm -f chroot-userDB.txt
[/bash]

【実行権限付与】

[bash] # chmod +x /sbin/chroot-share-userdel
[/bash]

【chrootユーザーを削除する】

 

[bash] # chroot-share-userdel 削除するユーザー名
[/bash]

【chrootユーザーを追加する】

[bash] # chroot-share-useradd 追加するユーザー名
[/bash]

testuserのWEBディレクトリにアクセスする

[bash]# echo “testuserのページですー!” >> /home/testuser/public_html/index.html[/bash]

 

またはWinSCPやFFFTPなりでファイルをアップロードしてください。
ブラウザでアクセスしてね。

http://ドメイン/testuser/

見れるはずです。

この後はどうしよう・・?

いちいちサーバーにSSHで繋がなくても
PHPを使ってWEBページの会員入力からユーザーを
追加や削除なんて事もできちゃったりするんですー!

またCMSを制作していますので、ユーザー追加と同時に
データベースも作成されるようにスクリプトを調整していきます。

※手動で設定する場合

手動でsshには接続させない、vsftpdには接続可能なユーザーを作る。

[bash] [root@sysgcms yuu]# useradd -s /sbin/nologin testuser[/bash] [bash][root@sysgcms yuu]# passwd testuser[/bash] [bash][root@sysgcms yuu]# chmod 711 /home/testuser[/bash] [bash][root@sysgcms yuu]# vi /etc/vsftpd/user_list[/bash]

名前を追加します。

[bash] [root@sysgcms yuu]# service vsftpd restart
vsftpd を停止中: [ OK ] vsftpd 用の vsftpd を起動中: [ OK ] [/bash]

おまけ スクリプト解説

CHROOT_USERNAME=$1

//解説—————————–

$1は第1引数
$2は第2引数

# ./スクリプト taro yamada

この場合
$1はtaro
$2はyamada

//——————————–

# パスワード設定を3回(default)ミスしたら作成したユーザーを消してスクリプト緊急停止。
passwd $CHROOT_USERNAME
if [ $? = 1 ] ; then
chroot-share-userdel $CHROOT_USERNAME
exit 1
fi

//解説—————————–
$?は一行前の処理の結果の値を返す。
$? = 1//成功
$? = 0//失敗

exit 1 //失敗でスクリプト停止

//——————————–

#vsftpdサーバに追加します。
#sftpが入っているので、vsftpdを使わないなら必要ないです。
# vsftpdユーザー内に登録ユーザーが存在していなければ登録する。
if ! grep -q $CHROOT_USERNAME /etc/vsftpd/user_list; then
echo $CHROOT_USERNAME >> /etc/vsftpd/user_list
fi
#設定反映
/etc/rc.d/init.d/vsftpd reload

//解説—————————–
if 条件式 ; then
処理
fi

条件式が成立するなら処理を行う。

if ! 条件式 ; then
処理
fi

条件式が成立しないなら処理を行う

//——————————–

CHROOT_USERNAME=$1

echo $CHROOT_USERNAME” を削除してよろしいですか? [Y/n]”
read ANSWER

case $ANSWER in
“” | “Y” | “y” | “yes” | “Yes” | “YES” )
userdel -r $CHROOT_USERNAME > /dev/null 2>&1
rm -rf /home/$CHROOT_USERNAME
sed -i “/^$CHROOT_USERNAME$/d” /etc/vsftpd/user_list;;
* ) echo “NO!!”;;
esac

//解説—————————–
echo “何か入力してください”
read 変数
打ち込まれた値を変数に入れる。

case $ANSWER in
Aの場合 || Bの場合 )
AまたはBの場合の処理;;
Cの場合 )
Cを選んだ場合の処理;;
* ) AとBとCを除く全ての場合の処理;;
esac

//——————————–

userdel -r $CHROOT_USERNAME > /dev/null 2>&1
rm -rf /home/$CHROOT_USERNAME
sed -i “/^$CHROOT_USERNAME$/d” /etc/vsftpd/user_list

//解説—————————–
処理 > /dev/null 2>&1

処理の後に何もメッセージを出さないようにする。

sed -i “/^文字列/d” ファイルパス

文字列が完全に一致している行を削除

//——————————–

ホームページ CMS
最新情報をチェックしよう!
>システム構築・保守に特化した会社です。

システム構築・保守に特化した会社です。

システムの構築・保守運用「システムガーディアン」 社内システム担当が欲しいが、専属で雇うほどの仕事量はない。 必要な時に必要なだけ頼りたいというお悩みを持つ企業様へ専門知識を持って対応を行っております。 サーバから各種システムまで自社・他社で構築されたシステムに対してサポートを行っております。

CTR IMG