7.6 KiB
7.6 KiB
VPN Access Server Development Plan
1. Objectives
The goal of this project is to extend an OpenVPN-based VPN access server with the following custom features:
- MAC Address Validation: Ensure that only devices with authorized MAC addresses can connect.
- Session Time Management: Enforce per-user session duration policies.
2. System Architecture
Components
- OpenVPN Server: Handles client VPN connections and enforces authentication hooks.
- Python Access Control Scripts: Custom scripts invoked by OpenVPN hooks (via
client-connectandclient-disconnect). - MySQL Database: Centralized storage for user, MAC, and session management.
- Syslog / Logging: Logs authentication attempts, MAC rejections, and session usage.
Architecture Flow
- OpenVPN receives a connection attempt.
- OpenVPN calls the Python script (
client-connect) with client environment variables. - Python script queries MySQL database to validate:
- User is active.
- MAC address is allowed for the user.
- Session time limit not exceeded.
- If validation fails → OpenVPN rejects the session.
- On disconnect, Python script (
client-disconnect) updates session time in the database.
3. Database Schema
employees table
| Column | Type | Notes |
|---|---|---|
| id | INT (PK) | Primary key |
| username | VARCHAR(255) | Unique, not null, indexed |
| password | VARCHAR(255) | not null |
| employee_name | VARCHAR(255) | Employee/VPN name (not null) |
| employee_email | VARCHAR(255) | Unique email, indexed |
| is_active | BOOLEAN | Default TRUE, indexed |
| session_limit | INT | Max allowed session (secs) |
| created_at | DATETIME | Default CURRENT_TIMESTAMP |
| updated_at | DATETIME | Auto-updated on change |
Constraints: UNIQUE (username), UNIQUE (employee_email)
Indexes: idx_username, idx_email, idx_active
mac_addresses table
| Column | Type | Notes |
|---|---|---|
| id | INT (PK) | Primary key |
| employee_id | INT (FK) | References employees.id (ON DELETE CASCADE) |
| mac | VARCHAR(17) | Allowed MAC address (unique per employee) |
| created_at | DATETIME | Default CURRENT_TIMESTAMP |
| updated_at | DATETIME | Auto-updated on change |
Constraints: UNIQUE (employee_id, mac)
Indexes: idx_mac
sessions table
| Column | Type | Notes |
|---|---|---|
| id | INT (PK) | Primary key |
| employee_id | INT (FK) | References employees.id (ON DELETE CASCADE) |
| start_time | DATETIME | Connection start (not null), indexed |
| end_time | DATETIME | Connection end, indexed |
| duration | INT | Session length in seconds |
| created_at | DATETIME | Default CURRENT_TIMESTAMP |
| updated_at | DATETIME | Auto-updated on change |
Indexes: idx_user_id, idx_start_time, idx_end_time
4. Python Script Design
client-connect.py
- Input: OpenVPN environment vars (
common_name,ifconfig_pool_remote_ip,trusted_ip, etc.). - Workflow:
- Extract username and MAC from environment.
- Query database:
- Check if user is active.
- Check if MAC is in allowed list.
- Check total session duration for today vs.
session_limit.
- If pass → allow connection, insert row into
sessionswithstart_time. - If fail → exit with error code (OpenVPN rejects).
client-disconnect.py
- Input: OpenVPN environment vars.
- Workflow:
- Lookup current session by user and start time.
- Update
end_timeanddurationinsessions. - Commit changes to DB.
5. Development Plan
Phase 1: Environment Setup
- Configure OpenVPN server with
client-connectandclient-disconnecthooks. - Setup Python virtual environment under
/etc/openvpn/access. - Setup MySQL database schema.
Phase 2: Database Integration
- Write Python database utility module for MySQL connection pooling.
- Test CRUD operations on
users,mac_addresses, andsessions.
Phase 3: Client Validation Logic
- Implement
client-connect.pylogic for user/MAC/session validation. - Implement
client-disconnect.pyfor session tracking.
Phase 4: Testing
- Unit test Python scripts with mock environment variables.
- Integration test with OpenVPN clients.
Phase 5: Deployment
- Deploy Python scripts into
/etc/openvpn/access. - Secure DB credentials with
.envor config file. - Harden OpenVPN server config.
6. Security Considerations
- Use parameterized SQL queries to prevent injection.
- Secure DB access with strong user/password, TLS if available.
- Log all failed validation attempts.
- Apply principle of least privilege for DB accounts.
VPN Access Server Development Plan
1. Objectives
- Validate client MAC addresses during VPN authentication.
- Manage session time (e.g., max duration, timeout) per user.
- Store and manage data in MySQL.
- Provide an extensible Python-based server-side solution for OpenVPN integration.
2. System Architecture
Components
-
OpenVPN Server
- Uses TUN mode.
- Forwards traffic to the NAS subnet (
172.16.14.0/24) via the Ubuntu VPN gateway. - Executes external Python scripts for authentication and session management.
-
VPN Access Server (Python)
- Python service located under
/etc/openvpn/access/. - Handles MAC validation and session management logic.
- Directly interacts with MySQL for data persistence (no extra management tool needed).
- Python service located under
-
MySQL Database
- Stores user credentials, MAC addresses, and session details.
- Provides logs for auditing.
Recommended Project Structure
vpn-access-server/
│
├── access/ # Core Python scripts (linked to OpenVPN)
│ ├── __init__.py
│ ├── auth.py # User authentication & MAC validation
│ ├── session.py # Session tracking and enforcement
│ ├── db.py # MySQL connection and queries
│ ├── utils.py # Shared utilities
│ └── config.py # Config loader (DB creds, constants)
│
├── tests/ # Unit & integration tests
│ ├── test_auth.py
│ ├── test_session.py
│ └── test_db.py
│
├── scripts/ # Helper scripts (migration, DB setup)
│ ├── init_db.py
│ └── seed_data.py
│
├── requirements.txt # Python dependencies
├── README.md # Documentation
This structure follows a modular layered architecture (separating auth, session, db, utils).
It is clean, scalable, and easy to maintain.