Minimal, command-first tutorial. For each step: command (run as sudo) followed by a one-line explanation.

Objective

The objective of this experiment is to test and evaluate student knowledge and practical skills in setting up and managing webservers, virtual machines, firewalls, and Linux-based systems.


0. Quick notes (before you start)

  • Run all commands as a user with sudo.

  • Replace example IP addresses and passwords with your real values.


Ubuntu Steps

1. Update system

sudo apt update && sudo apt upgrade -y

Update packages.

2. Install Apache, MariaDB, PHP

sudo apt install apache2 mariadb-server php libapache2-mod-php php-mysql phpmyadmin ufw -y

Install stack + phpMyAdmin + UFW.

3. Enable services

sudo systemctl enable --now apache2 mariadb

Start Apache + MariaDB.

4. Secure MariaDB

sudo mysql_secure_installation

Run interactive hardening.

5. Configure Apache for PHP

sudo a2enmod php*  # enables installed PHP module
sudo systemctl restart apache2

Enable PHP support.

6. Enable PHP extensions (mysqli + pdo_mysql are usually enabled by default)

php -m | grep -E "mysqli|pdo_mysql"

Check extensions.

7. Setup phpMyAdmin

  • During install, select Apache2 and allow dbconfig-common to configure.

  • If skipped, manually symlink:

sudo ln -s /usr/share/phpmyadmin /var/www/html/phpmyadmin

8. Create DB user

sudo mysql -u root -p -e "CREATE USER 'pmauser'@'localhost' IDENTIFIED BY 'StrongPass'; GRANT ALL PRIVILEGES ON *.* TO 'pmauser'@'localhost' WITH GRANT OPTION; FLUSH PRIVILEGES;"

New user.

9. Access phpMyAdmin

http://<server-ip>/phpmyadmin

Login as pmauser.

10. Setup UFW

sudo ufw allow OpenSSH
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow from 192.168.1.50 to any port 80 proto tcp
sudo ufw allow from 203.0.113.25 to any port 80 proto tcp
sudo ufw enable

Allow only selected IPs.

11. Check UFW

sudo ufw status numbered

Verify firewall.


Arch Linux Steps

1. Update system

sudo pacman -Syu

Update packages.

2. Install required packages

sudo pacman -S apache php php-apache mariadb phpmyadmin ufw

Install Apache, PHP, MariaDB, phpMyAdmin, UFW.

3. Initialize MariaDB

sudo mariadb-install-db --user=mysql --basedir=/usr --datadir=/var/lib/mysql

Setup MariaDB system tables.

4. Enable services

sudo systemctl enable --now httpd mariadb

Start and enable Apache + MariaDB.

5. Secure MariaDB

sudo mysql_secure_installation

Run interactive security script.

6. Backup Apache config

sudo cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.bak

Backup config.

7. Switch to prefork MPM

sudo sed -i 's/^LoadModule mpm_event_module/#&/' /etc/httpd/conf/httpd.conf
sudo sed -i 's/^#LoadModule mpm_prefork_module/LoadModule mpm_prefork_module/' /etc/httpd/conf/httpd.conf

Enable prefork, disable event MPM.

8. Add PHP module to Apache

grep -q "LoadModule php_module" /etc/httpd/conf/httpd.conf || sudo tee -a /etc/httpd/conf/httpd.conf <<'EOF'
LoadModule php_module modules/libphp.so
AddHandler php-script .php
Include conf/extra/php_module.conf
EOF

Load PHP module.

9. Create php_module.conf

sudo tee /etc/httpd/conf/extra/php_module.conf <<'EOF'
<IfModule php_module>
    DirectoryIndex index.php
    AddType application/x-httpd-php .php
    AddType application/x-httpd-php-source .phps
</IfModule>
EOF

Apache config for PHP.

10. Enable PHP extensions

sudo sed -i 's/^;\?extension=pdo_mysql/extension=pdo_mysql/' /etc/php/php.ini
sudo sed -i 's/^;\?extension=mysqli/extension=mysqli/' /etc/php/php.ini

Enable mysqli + pdo_mysql.

11. Set timezone

sudo sed -i 's@^;\?date.timezone.*@date.timezone = Asia/Kolkata@' /etc/php/php.ini

Adjust PHP timezone.

12. Configure phpMyAdmin Apache alias

sudo tee /etc/httpd/conf/extra/phpmyadmin.conf <<'EOF'
Alias /phpmyadmin "/usr/share/webapps/phpMyAdmin"
<Directory "/usr/share/webapps/phpMyAdmin">
    DirectoryIndex index.php
    AllowOverride All
    Options FollowSymLinks
    Require ip 192.168.1.50 203.0.113.25
</Directory>
EOF

Alias and restrict phpMyAdmin.

13. Include phpMyAdmin config

echo 'Include conf/extra/phpmyadmin.conf' | sudo tee -a /etc/httpd/conf/httpd.conf

Load config.

14. Create tmp directory

sudo mkdir -p /usr/share/webapps/phpMyAdmin/tmp
sudo chown http:http /usr/share/webapps/phpMyAdmin/tmp

Writable tmp dir.

15. Restart Apache

sudo systemctl restart httpd

Apply changes.

16. Test PHP

echo "<?php phpinfo(); ?>" | sudo tee /srv/http/info.php

Visit /info.php.

17. Create phpMyAdmin user

sudo mysql -u root -e "CREATE USER 'pmauser'@'localhost' IDENTIFIED BY 'StrongPass'; GRANT ALL PRIVILEGES ON *.* TO 'pmauser'@'localhost' WITH GRANT OPTION; FLUSH PRIVILEGES;"

New DB user.

18. Access phpMyAdmin

http://<server-ip>/phpmyadmin

Login as pmauser.

19. Setup UFW

sudo ufw allow OpenSSH
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow from 192.168.1.50 to any port 80 proto tcp
sudo ufw allow from 203.0.113.25 to any port 80 proto tcp
sudo ufw enable

Firewall setup.

20. Check UFW

sudo ufw status verbose

Verify rules.


Final Test Checklist (both Arch & Ubuntu)

  1. Visit http://<server-ip>/info.php → shows PHP info with mysqli + pdo_mysql.

  2. Visit http://<server-ip>/phpmyadmin → phpMyAdmin login.

  3. Run sudo ufw status → confirm allowed IPs only.