From 2bbc4c7761a6d0e97cc8f22bccbea94835fcbc7d Mon Sep 17 00:00:00 2001 From: tbrehm <t.brehm@ispconfig.org> Date: Fri, 28 Aug 2009 06:55:06 -0400 Subject: [PATCH] Add the website user and group also to the passwd and group files in chroot enviroment. --- server/plugins-available/apache2_plugin.inc.php | 69 ++++++++++++++++++++++++++-------- 1 files changed, 53 insertions(+), 16 deletions(-) diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index 1749acd..4014f2a 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -235,6 +235,13 @@ $app->uses("getconf"); $web_config = $app->getconf->get_server_config($conf["server_id"], 'web'); + //* Check if this is a chrooted setup + if($web_config['website_basedir'] != '' && @is_file($web_config['/var/www'].'/etc/passwd')) { + $apache_chrooted = true; + } else { + $apache_chrooted = false; + } + if($data["new"]["document_root"] == '') { $app->log("document_root not set",LOGLEVEL_WARN); return 0; @@ -292,7 +299,7 @@ $command .= ' '.escapeshellcmd($data["new"]["system_user"]); exec($command); - + if($apache_chrooted) exec("chroot ".escapeshellcmd($web_config['website_basedir'])." ".$command); } @@ -438,12 +445,14 @@ $groupname = escapeshellcmd($data["new"]["system_group"]); if($data["new"]["system_group"] != '' && !$app->system->is_group($data["new"]["system_group"])) { exec("groupadd $groupname"); + if($apache_chrooted) exec("chroot ".escapeshellcmd($web_config['website_basedir'])." groupadd $groupname"); $app->log("Adding the group: $groupname",LOGLEVEL_DEBUG); } $username = escapeshellcmd($data["new"]["system_user"]); if($data["new"]["system_user"] != '' && !$app->system->is_user($data["new"]["system_user"])) { exec("useradd -d ".escapeshellcmd($data["new"]["document_root"])." -g $groupname -G sshusers $username -s /bin/false"); + if($apache_chrooted) exec("chroot ".escapeshellcmd($web_config['website_basedir'])." "."useradd -d ".escapeshellcmd($data["new"]["document_root"])." -g $groupname -G sshusers $username -s /bin/false"); $app->log("Adding the user: $username",LOGLEVEL_DEBUG); } @@ -461,13 +470,12 @@ if($this->action == 'insert') { // Chown and chmod the directories below the document root - exec("chown -R $username:$groupname ".escapeshellcmd($data["new"]["document_root"])); - + $this->_exec("chown -R $username:$groupname ".escapeshellcmd($data["new"]["document_root"])); // The document root itself has to be owned by root in normal level and by the web owner in security level 20 if($web_config['security_level'] == 20) { - exec("chown $username:$groupname ".escapeshellcmd($data["new"]["document_root"])); + $this->_exec("chown $username:$groupname ".escapeshellcmd($data["new"]["document_root"])); } else { - exec("chown root:root ".escapeshellcmd($data["new"]["document_root"])); + $this->_exec("chown root:root ".escapeshellcmd($data["new"]["document_root"])); } } @@ -476,20 +484,34 @@ //* If the security level is set to high if($web_config['security_level'] == 20) { - exec("chmod 751 ".escapeshellcmd($data["new"]["document_root"]."/")); - exec("chmod 751 ".escapeshellcmd($data["new"]["document_root"])."/*"); - exec("chmod 710 ".escapeshellcmd($data["new"]["document_root"]."/web")); + $this->_exec("chmod 751 ".escapeshellcmd($data["new"]["document_root"]."/")); + $this->_exec("chmod 751 ".escapeshellcmd($data["new"]["document_root"])."/*"); + $this->_exec("chmod 710 ".escapeshellcmd($data["new"]["document_root"]."/web")); // make temp direcory writable for the apache user and the website user - exec("chmod 777 ".escapeshellcmd($data["new"]["document_root"]."/tmp")); + $this->_exec("chmod 777 ".escapeshellcmd($data["new"]["document_root"]."/tmp")); $command = 'usermod'; $command .= ' --groups sshusers'; $command .= ' '.escapeshellcmd($data["new"]["system_user"]); - exec($command); + $this->_exec($command); + + //* if we have a chrooted apache enviroment + if($apache_chrooted) { + exec("chroot ".escapeshellcmd($web_config['website_basedir'])." ".$command); + + //* add the apache user to the client group in the chroot enviroment + $tmp_groupfile = $app->system->server_conf["group_datei"]; + $app->system->server_conf["group_datei"] = $web_config['website_basedir'].'/etc/group'; + $app->system->add_user_to_group($groupname, escapeshellcmd($web_config['user'])); + $app->system->server_conf["group_datei"] = $tmp_groupfile; + unset($tmp_groupfile); + } //* add the apache user to the client group $app->system->add_user_to_group($groupname, escapeshellcmd($web_config['user'])); + + $this->_exec("chown $username:$groupname ".escapeshellcmd($data["new"]["document_root"])); /* * Workaround for jailkit: If jailkit is enabled for the site, the @@ -499,20 +521,20 @@ //* Check if there is a jailkit user for this site $tmp = $app->db->queryOneRecord("SELECT count(shell_user_id) as number FROM shell_user WHERE parent_domain_id = ".$data["new"]["domain_id"]." AND chroot = 'jailkit'"); if($tmp['number'] > 0) { - exec("chmod 755 ".escapeshellcmd($data["new"]["document_root"]."/")); - exec("chown root:root ".escapeshellcmd($data["new"]["document_root"]."/")); + $this->_exec("chmod 755 ".escapeshellcmd($data["new"]["document_root"]."/")); + $this->_exec("chown root:root ".escapeshellcmd($data["new"]["document_root"]."/")); } unset($tmp); // If the security Level is set to medium } else { - exec("chmod 755 ".escapeshellcmd($data["new"]["document_root"]."/")); - exec("chmod 755 ".escapeshellcmd($data["new"]["document_root"]."/*")); - exec("chown root:root ".escapeshellcmd($data["new"]["document_root"]."/")); + $this->_exec("chmod 755 ".escapeshellcmd($data["new"]["document_root"]."/")); + $this->_exec("chmod 755 ".escapeshellcmd($data["new"]["document_root"]."/*")); + $this->_exec("chown root:root ".escapeshellcmd($data["new"]["document_root"]."/")); // make temp direcory writable for the apache user and the website user - exec("chmod 777 ".escapeshellcmd($data["new"]["document_root"]."/tmp")); + $this->_exec("chmod 777 ".escapeshellcmd($data["new"]["document_root"]."/tmp")); } @@ -808,6 +830,12 @@ $app->uses("getconf"); $web_config = $app->getconf->get_server_config($conf["server_id"], 'web'); + //* Check if this is a chrooted setup + if($web_config['website_basedir'] != '' && @is_file($web_config['/var/www'].'/etc/passwd')) { + $apache_chrooted = true; + } else { + $apache_chrooted = false; + } if($data["old"]["type"] != "vhost" && $data["old"]["parent_domain_id"] > 0) { //* This is a alias domain or subdomain, so we have to update the website instead @@ -888,6 +916,8 @@ $command = 'userdel'; $command .= ' '.$data["old"]["system_user"]; exec($command); + if($apache_chrooted) exec("chroot ".escapeshellcmd($web_config['website_basedir'])." ".$command); + } } @@ -916,6 +946,13 @@ } + //* Wrapper for exec function for easier debugging + private function _exec($command) { + global $app; + $app->log("exec: ".$command,LOGLEVEL_DEBUG); + exec($command); + } + } // end class -- Gitblit v1.9.1