11 KiB
Testing Guide
This document describes the comprehensive testing infrastructure for the OpenSSH server hardening role.
Overview
Our testing strategy ensures the role works correctly across all 15 supported distributions, from Debian Stretch (OpenSSH 7.4p1) to the latest releases with OpenSSH 10.0p1+.
✅ macOS Users: All tests work perfectly on macOS with Docker Desktop! See TESTING_MACOS.md for macOS-specific instructions.
Continuous Integration (GitHub Actions)
CI Pipeline
The CI pipeline runs on every push to main/develop branches and all pull requests.
Workflow: .github/workflows/ci.yml
Testing Matrix
Lint Job
- YAML Linting:
yamllint . - Ansible Linting:
ansible-lint --profile=production(strictest profile) - Python Version: 3.11
- Ansible Version: 2.15+
Molecule Job
Tests across 15 distributions in parallel:
| Distribution | Docker Image | OpenSSH Version | Feature Level |
|---|---|---|---|
| Debian 9 (Stretch) | debian:stretch |
7.4p1 | Legacy |
| Debian 10 (Buster) | debian:buster |
7.9p1 | Legacy |
| Debian 11 (Bullseye) | debian:bullseye |
8.4p1 | Modern |
| Debian 12 (Bookworm) | debian:bookworm |
9.2p1 | Modern |
| Debian 13 (Trixie) | debian:trixie |
10.0p1 | Latest |
| Debian Sid (Testing) | debian:sid |
10.0p1 | Latest |
| Ubuntu 16.04 (Xenial) | ubuntu:xenial |
7.2p2 | Legacy |
| Ubuntu 18.04 (Bionic) | ubuntu:bionic |
7.6p1 | Legacy |
| Ubuntu 20.04 (Focal) | ubuntu:focal |
8.2p1 | Modern |
| Ubuntu 22.04 (Jammy) | ubuntu:jammy |
8.9p1 | Modern |
| Ubuntu 24.04 (Noble) | ubuntu:noble |
9.6p1 | Latest |
| Ubuntu 24.10 (Oracular) | ubuntu:oracular |
9.7p1 | Latest |
CI Environment Variables
Each distribution test passes:
MOLECULE_DISTRO: Distribution identifier (e.g.,debian12,ubuntu2404)MOLECULE_IMAGE: Docker image to use (e.g.,debian:bookworm,ubuntu:noble)MOLECULE_OPENSSH_VERSION: Expected OpenSSH version (e.g.,9.2p1,9.6p1)
Molecule Testing
Test Phases
- Dependency: Install required Ansible collections
- Lint: YAML and Ansible linting (runs in separate job)
- Create: Spin up Docker container for target distribution
- Prepare: Install OpenSSH server and dependencies
- Converge: Apply the openssh_server role
- Verify: Run verification tests
- Destroy: Clean up test container
Molecule Configuration
File: molecule/default/molecule.yml
platforms:
- name: "${MOLECULE_DISTRO:-debian12}"
image: "${MOLECULE_IMAGE:-debian:bookworm}"
privileged: true
command: /lib/systemd/systemd
volumes:
- /sys/fs/cgroup:/sys/fs/cgroup:rw
The configuration uses environment variables for flexible testing across distributions.
Converge Phase
File: molecule/default/converge.yml
- Updates apt cache
- Installs
openssh-serverpackage - Applies the
openssh_serverrole
Verification Tests
File: molecule/default/verify.yml
Comprehensive verification includes:
1. Service Status
- Verifies SSH service is active and running
- Uses systemd to check service state
2. Configuration Validation
- Runs
sshd -tto validate configuration syntax - Ensures no syntax errors in generated config
3. Port Availability
- Checks SSH is listening on port 22
- Validates network accessibility
4. Version Verification
- Reports OpenSSH version via
ssh -V - Compares with expected version for the distribution
5. Security Hardening
- Verifies key security directives are set:
PasswordAuthenticationPermitRootLoginPubkeyAuthentication
Local Testing
Prerequisites
macOS (with Docker Desktop)
# 1. Install Docker Desktop for Mac
# Download from: https://www.docker.com/products/docker-desktop/
# 2. Install Python dependencies (using Homebrew's Python or system Python)
pip3 install molecule molecule-plugins[docker] ansible-core>=2.15
# 3. Install Ansible collections
ansible-galaxy collection install ansible.posix>=1.5.0
ansible-galaxy collection install community.general>=8.0.0
macOS Notes:
- ✅ Fully supported - All Molecule tests work on macOS with Docker Desktop
- Docker Desktop provides the Docker daemon required for Molecule
- Tests run in Linux containers via Docker Desktop's VM
- Performance may be slower than native Linux due to VM overhead
- No additional configuration needed - just ensure Docker Desktop is running
Linux
# 1. Install Docker
# See: https://docs.docker.com/engine/install/
# 2. Install testing dependencies
pip install molecule molecule-plugins[docker] ansible-core>=2.15
# 3. Install Ansible collections
ansible-galaxy collection install ansible.posix>=1.5.0
ansible-galaxy collection install community.general>=8.0.0
# 4. Add user to docker group (to avoid sudo)
sudo usermod -aG docker $USER
newgrp docker
Run All Tests
# Run complete test suite (default: Debian 12)
molecule test
# Test specific distribution
MOLECULE_DISTRO=ubuntu2404 \
MOLECULE_IMAGE=ubuntu:noble \
MOLECULE_OPENSSH_VERSION=9.6p1 \
molecule test
Development Workflow
# Create test environment
molecule create
# Run convergence (apply role)
molecule converge
# Run verification tests
molecule verify
# Login to test container
molecule login
# Destroy test environment
molecule destroy
Test Specific Distributions
# Debian Bookworm (modern)
MOLECULE_DISTRO=debian12 MOLECULE_IMAGE=debian:bookworm MOLECULE_OPENSSH_VERSION=9.2p1 molecule test
# Ubuntu 24.04 Noble (latest)
MOLECULE_DISTRO=ubuntu2404 MOLECULE_IMAGE=ubuntu:noble MOLECULE_OPENSSH_VERSION=9.6p1 molecule test
# Debian Stretch (legacy - test backwards compatibility)
MOLECULE_DISTRO=debian9 MOLECULE_IMAGE=debian:stretch MOLECULE_OPENSSH_VERSION=7.4p1 molecule test
# Ubuntu 16.04 Xenial (oldest supported)
MOLECULE_DISTRO=ubuntu1604 MOLECULE_IMAGE=ubuntu:xenial MOLECULE_OPENSSH_VERSION=7.2p2 molecule test
Testing Strategy
Coverage Goals
- Distribution Coverage: All 15 supported distributions
- Version Coverage: OpenSSH 7.2p2 through 10.0p1+
- Feature Coverage: Version-aware capability flags
- Security Coverage: Hardening verification
Feature Testing
The role's capability flags are tested across versions:
- Legacy (7.2 - 7.9): Basic hardening, limited modern features
- Modern (8.2 - 9.2): FIDO2 support, enhanced logging
- Latest (9.3+): RequiredRSASize, PerSourcePenalties
- Cutting Edge (9.9+): Post-quantum ML-KEM support
Backwards Compatibility
Testing ensures:
- Older distributions don't fail on unsupported directives
- Capability flags correctly enable/disable features
- Warnings display for EOL distributions
- Graceful degradation on legacy systems
CI/CD Integration
Pull Request Checks
All PRs must pass:
- ✅ YAML linting (yamllint)
- ✅ Ansible linting (production profile)
- ✅ Molecule tests on all 15 distributions
Branch Protection
mainbranch requires all CI checks to pass- No PR can be merged with failing tests
- Linting must pass with 0 failures, 0 warnings
Performance
- Lint job: ~2-3 minutes
- Molecule tests: ~5-10 minutes per distribution (parallel execution)
- Total CI time: ~10-15 minutes with parallelization
Test Maintenance
Adding New Distributions
When adding support for a new distribution:
-
Update CI Matrix (
.github/workflows/ci.yml):- distro: ubuntu2504 image: ubuntu:plucky openssh_version: "9.9p1" -
Update Documentation:
docs/DISTRIBUTIONS.md- Add to supported listdocs/TESTING.md- Update test matrixREADME.md- Update badges if needed
-
Test Locally First:
MOLECULE_DISTRO=ubuntu2504 \ MOLECULE_IMAGE=ubuntu:plucky \ MOLECULE_OPENSSH_VERSION=9.9p1 \ molecule test -
Update CHANGELOG:
### Added - Added support for Ubuntu 25.04 (Plucky) with OpenSSH 9.9p1
Updating OpenSSH Versions
When distributions update OpenSSH versions:
- Verify new version in distribution repositories
- Update
openssh_versionin CI matrix - Review and update capability flags if needed
- Update docs/DISTRIBUTIONS.md with new version
- Run full test suite to verify compatibility
Troubleshooting
Common Issues
macOS: Docker Desktop Not Running
# Error: Cannot connect to Docker daemon
# Solution: Ensure Docker Desktop is running
open -a Docker
# Verify Docker is running
docker ps
macOS: Permission Errors with pip
# Use user installation to avoid sudo
pip3 install --user molecule molecule-plugins[docker] ansible-core>=2.15
# Or use a virtual environment (recommended)
python3 -m venv venv
source venv/bin/activate
pip install molecule molecule-plugins[docker] ansible-core>=2.15
macOS: Slow Performance
# Docker Desktop on macOS runs containers in a VM, which can be slower
# To improve performance:
# 1. Allocate more resources in Docker Desktop preferences
# (Settings → Resources → increase CPUs and Memory)
# 2. Ensure Docker Desktop is using VirtioFS (Settings → General)
# 3. Consider testing only specific distributions instead of all 15
Linux: Docker Permission Errors
# Add user to docker group
sudo usermod -aG docker $USER
newgrp docker
Molecule Not Found
# Ensure Molecule is installed
pip install --upgrade molecule molecule-plugins[docker]
# On macOS, you may need pip3
pip3 install --upgrade molecule molecule-plugins[docker]
Systemd in Containers
The role requires systemd for SSH service management. Our Molecule config enables this:
privileged: true
command: /lib/systemd/systemd
volumes:
- /sys/fs/cgroup:/sys/fs/cgroup:rw
On macOS: Docker Desktop supports privileged containers and cgroup mounting, so systemd works correctly.
Old Distribution Images
Some older distributions (Debian Stretch, Ubuntu Xenial) may have deprecated mirrors:
- Tests may be slower due to repository access
- Consider skipping EOL distributions in local development
- CI will still test them for compatibility
macOS: Platform-Specific Issues
Issue: "cannot mount /sys/fs/cgroup" errors
- Solution: This is expected on older Docker Desktop versions. Update to latest Docker Desktop (4.x+)
Issue: Tests hang during systemd startup
- Solution: Increase Docker Desktop memory allocation to at least 4GB
- Go to: Docker Desktop → Settings → Resources → Memory
Issue: IPv6 related warnings
- Solution: These warnings are harmless and can be ignored on macOS
Resources
- Molecule Documentation: https://molecule.readthedocs.io/
- GitHub Actions: https://docs.github.com/en/actions
- Docker Hub Images: https://hub.docker.com/
- Ansible Lint: https://ansible.readthedocs.io/projects/lint/
Last updated: 2025-10-05