PHPとApacheのユーザー実行 +SSHの秘密鍵

rsyncなどの実行をWEBページインターフェイスから実行しようと思うとそもそものユーザーではなくApacheがユーザーとして実行するので思うように実行できないことがります。更にSSHでリモート接続するときは実行ユーザーが全く違うので秘密鍵を読めないということになります。
しかし開発をしているとごく頻繁にいわゆるログインユーザーとApacheユーザーを併用したいという状況が訪れます。以下のユーザーを例にして説明します。

user: sampleuser
Apache: apache

PHPの実行ユーザーは以下で取得できます。

posix_getpwuid(posix_geteuid())['name']

cliでコマンドラインで実行すると想定通りのsampleuserとなりますが、webから実行すると違うユーザーになっています。webページ内でshell_exec()やexec()で実行するとその環境によっていろいろなユーザーになります。LinuxのApacheではapacheユーザー、XAMPPなどの環境ではdaemonとかになっていたります。Windowsサーバーではまた違ったことになっていると思います。nginxはどうなんでしょ。
このようにsampleuserとapacheに同じ仕事をさせたいときはGroupユーザーを作成するかsudoで実行するという2つの方法があります。

Groupユーザーで実行する。

まずはapacheがsampleユーザーと同じ権限で実行できるようにしてみます。このときapacheユーザーでの試行はコマンドラインではデフォルトではできません。suでaoacheユーザーになれないわけです。なのでまずはapaceユーザーでコマンドラインから実行できるようにします。

grep apache /etc/passwd
apache:x:48:48:Apache:/var/www:/sbin/nologin

apacheユーザーのログインシェルを確認するとnologinになっていて、実行ユーザとしてはdaemonしか利用できないことになっています。suすると「This account is currently not available.」となりエラーになります。このようなときは、一時的にログインシェルを変更してapacheユーザーになることができます。

su -s /bin/bash apache
id
uid=48(apache) gid=48(apache) groups=48(apache)

この時点でapacheユーザーにsuできているので、これでいろいろできるようになります。上記の条件でいうとwebページからのアクセスと同じ権限で実行ができるようになります。
ホームディレクトリを確認すると、

cd ~
pwd
/var/www

/var/wwwであることがわかります。.bashrcや.bash_profileはここにおいておくとよいです。

apacheユーザーがSSH接続できるようにする

最もシンプルに考えるとSSHの接続だけであればapacheユーザーにSSHの接続権限を与えてあげるのがよいと思います。
(※SSHの秘密鍵の設定は割愛)
/var/www/.sshという感じでSSHに関連する設定をしておけばOK。apacheユーザーでSSHの接続が可能になります。

Last update: 2018.03.04 (日)