{"id":4662,"date":"2026-09-21T01:01:11","date_gmt":"2026-09-20T19:31:11","guid":{"rendered":"https:\/\/cpanelfree.com\/blog\/linux-pam-pluggable-authentication-modules-hardening-with-google-authenticator-mfa\/"},"modified":"2026-09-21T01:01:11","modified_gmt":"2026-09-20T19:31:11","slug":"linux-pam-pluggable-authentication-modules-hardening-with-google-authenticator-mfa","status":"publish","type":"post","link":"https:\/\/cpanelfree.com\/blog\/linux-pam-pluggable-authentication-modules-hardening-with-google-authenticator-mfa\/","title":{"rendered":"Linux PAM (Pluggable Authentication Modules) Hardening with Google Authenticator MFA"},"content":{"rendered":"<p>Securing enterprise Linux infrastructure against credential stuffing, compromised private keys, and lateral movement requires moving beyond single-factor SSH key authentication to a zero-trust model. By integrating Pluggable Authentication Modules (PAM) with RFC 6238 Time-based One-Time Password (TOTP) algorithms, systems engineers can enforce cryptographic multi-factor authentication (MFA) without introducing external identity provider latency. When architecting resilient hosting environments at <a href=\"https:\/\/cpanelfree.com\">CpanelFree<\/a>, hardening PAM stacks ensures administrative shells remain strictly isolated from unauthorized external ingress.<\/p>\n<p><!-- more --><\/p>\n<h2 style=\"color:#38bdf8;font-size:24px;margin-top:32px;margin-bottom:16px\">What is Linux PAM Google Authenticator MFA?<\/h2>\n<div style=\"background:#1e293b;border-left:4px solid #10b981;padding:16px 20px;margin:20px 0;border-radius:0 8px 8px 0;color:#e2e8f0;font-size:15px;line-height:1.6\">\n  <strong style=\"color:#10b981\">Direct Answer:<\/strong> Linux PAM Google Authenticator MFA is a modular authentication architecture that couples Linux Pluggable Authentication Modules (PAM) with OpenSSH using the <code>pam_google_authenticator.so<\/code> shared object. It enforces a strict multi-stage challenge requiring both an asymmetric SSH private key and an RFC 6238 time-synchronized 6-digit TOTP token before granting shell execution privileges.\n<\/div>\n<p>Pluggable Authentication Modules (PAM) decouple local system applications from underlying authentication mechanisms. Originating from the Open Software Foundation RFC 86.0 and implemented in Linux via <code>Linux-PAM<\/code>, this dynamic architecture allows system administrators to define distinct authentication stacks across four management groups: <code>auth<\/code> (credential validation), <code>account<\/code> (account expiration and access rights), <code>password<\/code> (token updates), and <code>session<\/code> (audit logging and environment provisioning). By injecting <code>pam_google_authenticator.so<\/code> into the <code>auth<\/code> facility of the OpenSSH daemon (<code>\/etc\/pam.d\/sshd<\/code>), authentication transitions from a single point of failure into a defense-in-depth pipeline.<\/p>\n<h2 style=\"color:#38bdf8;font-size:24px;margin-top:32px;margin-bottom:16px\">Architectural Analysis: How PAM Processes Multi-Factor Challenges<\/h2>\n<p>To understand PAM execution flow, consider how OpenSSH handles client handshakes under hardened multi-factor conditions. In a standard SSH session, client authentication finishes once the public key cryptographic signature matches the public key stored in <code>~\/.ssh\/authorized_keys<\/code>. When PAM is activated alongside <code>AuthenticationMethods publickey,keyboard-interactive<\/code>, the SSH daemon suspends session initialization after public key validation and initiates a sub-protocol challenge via the PAM library.<\/p>\n<p>The PAM engine evaluates rules sequentially within the service configuration. Each rule adheres to the canonical syntax:<\/p>\n<pre><code style=\"background:#0f172a;color:#38bdf8;padding:16px;border-radius:8px;display:block;font-family:monospace;font-size:13px;line-height:1.6\"># Syntax: &lt;management-interface&gt; &lt;control-flag&gt; &lt;module-path&gt; &lt;module-arguments&gt;\nauth requisite pam_google_authenticator.so nullok secret=\/var\/run\/mfa\/${USER}\/.google_authenticator step=30<\/code><\/pre>\n<p>The control flag dictates how PAM responds to success or failure from a module:<\/p>\n<ul>\n<li><strong style=\"color:#38bdf8\">required:<\/strong> The module must succeed. If it fails, PAM continues executing subsequent modules in the stack, but the overall authentication will ultimately fail. This prevents timing attacks that reveal which module rejected the login.<\/li>\n<li><strong style=\"color:#38bdf8\">requisite:<\/strong> The module must succeed. If it fails, PAM terminates execution immediately and rejects the connection, preventing unnecessary prompts or resource utilization.<\/li>\n<li><strong style=\"color:#38bdf8\">sufficient:<\/strong> If this module succeeds and no prior <code>required<\/code> module failed, PAM halts execution and grants access immediately.<\/li>\n<li><strong style=\"color:#38bdf8\">optional:<\/strong> The result is only factored in if no other modules in the stack provide a definitive result.<\/li>\n<\/ul>\n<div style=\"background:#1e293b;border-left:4px solid #38bdf8;padding:16px 20px;margin:24px 0;border-radius:0 8px 8px 0;color:#e2e8f0\">\n  <strong style=\"color:#38bdf8\">Architecture Note:<\/strong> When combining asymmetric public key authentication with TOTP verification, avoid using <code>common-auth<\/code> inclusion directly without inspection. Standard Debian\/Ubuntu installations include <code>@include common-auth<\/code> in <code>\/etc\/pam.d\/sshd<\/code>, which cascades into <code>pam_unix.so<\/code>. If not decoupled, the user may be unexpectedly prompted for their system UNIX password in addition to their MFA token.\n<\/div>\n<h2 style=\"color:#38bdf8;font-size:24px;margin-top:32px;margin-bottom:16px\">Comparative Matrix: Default SSH vs PAM-Hardened MFA Architecture<\/h2>\n<p>Evaluating the performance, security surface, and operational footprint of SSH deployment architectures illustrates the tactical advantages of an engineered PAM stack:<\/p>\n<table style=\"width:100%;border-collapse:collapse;margin:24px 0;background:#1e293b;color:#e2e8f0;font-size:14px;border-radius:8px;overflow:hidden\">\n<thead style=\"background:#0f172a;color:#38bdf8\">\n<tr>\n<th style=\"padding:12px 16px;border-bottom:2px solid #334155;text-align:left\">Feature \/ Metric<\/th>\n<th style=\"padding:12px 16px;border-bottom:2px solid #334155;text-align:left\">Standard SSH (Key Only)<\/th>\n<th style=\"padding:12px 16px;border-bottom:2px solid #334155;text-align:left\">Tuned PAM + TOTP MFA<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"padding:12px 16px;border-bottom:1px solid #334155\">Authentication Factors<\/td>\n<td style=\"padding:12px 16px;border-bottom:1px solid #334155\">Single Factor (Possession: Key)<\/td>\n<td style=\"padding:12px 16px;border-bottom:1px solid #334155;color:#10b981;font-weight:600\">Two-Factor (Possession + Ephemeral TOTP)<\/td>\n<\/tr>\n<tr>\n<td style=\"padding:12px 16px;border-bottom:1px solid #334155\">Stolen Private Key Exposure<\/td>\n<td style=\"padding:12px 16px;border-bottom:1px solid #334155\">Total Compromise<\/td>\n<td style=\"padding:12px 16px;border-bottom:1px solid #334155;color:#10b981;font-weight:600\">Zero Access (Blocked at PAM Challenge)<\/td>\n<\/tr>\n<tr>\n<td style=\"padding:12px 16px;border-bottom:1px solid #334155\">Authentication Handshake Overhead<\/td>\n<td style=\"padding:12px 16px;border-bottom:1px solid #334155\">~15ms &#8211; 25ms<\/td>\n<td style=\"padding:12px 16px;border-bottom:1px solid #334155;color:#10b981;font-weight:600\">~18ms &#8211; 30ms (Local TOTP Computation)<\/td>\n<\/tr>\n<tr>\n<td style=\"padding:12px 16px;border-bottom:1px solid #334155\">External IdP Dependency<\/td>\n<td style=\"padding:12px 16px;border-bottom:1px solid #334155\">None<\/td>\n<td style=\"padding:12px 16px;border-bottom:1px solid #334155;color:#10b981;font-weight:600\">Zero (Air-gapped RFC 6238 Verification)<\/td>\n<\/tr>\n<tr>\n<td style=\"padding:12px 16px;border-bottom:1px solid #334155\">Replay Attack Vulnerability<\/td>\n<td style=\"padding:12px 16px;border-bottom:1px solid #334155\">Protected (Challenge-Response)<\/td>\n<td style=\"padding:12px 16px;border-bottom:1px solid #334155;color:#10b981;font-weight:600\">Immune (One-Time Token Invalidation)<\/td>\n<\/tr>\n<tr>\n<td style=\"padding:12px 16px;border-bottom:1px solid #334155\">Automated CI\/CD Integration<\/td>\n<td style=\"padding:12px 16px;border-bottom:1px solid #334155\">Native via Keypair<\/td>\n<td style=\"padding:12px 16px;border-bottom:1px solid #334155;color:#10b981;font-weight:600\">Granular CIDR Bypass via pam_access<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2 style=\"color:#38bdf8;font-size:24px;margin-top:32px;margin-bottom:16px\">Production Implementation: Step-by-Step PAM &amp; SSH Daemon Hardening<\/h2>\n<p>Implementing enterprise-grade MFA requires precision configuration across package management, file permissions, PAM profiles, and the OpenSSH daemon. Follow this validated deployment procedure for Debian, Ubuntu, RHEL, and Rocky Linux systems.<\/p>\n<h3 style=\"color:#38bdf8;font-size:18px;margin-top:24px;margin-bottom:12px\">1. Package Installation and Cryptographic Prerequisites<\/h3>\n<p>Install the Google Authenticator PAM module package. On Debian and Ubuntu systems, execute:<\/p>\n<pre><code style=\"background:#0f172a;color:#38bdf8;padding:16px;border-radius:8px;display:block;font-family:monospace;font-size:13px;line-height:1.6\"># Update repository cache and install PAM module with Qrencode support\nsudo apt-get update &amp;&amp; sudo apt-get install -y libpam-google-authenticator libqrencode4<\/code><\/pre>\n<p>On RHEL 9 or Rocky Linux 9 environments (with EPEL enabled):<\/p>\n<pre><code style=\"background:#0f172a;color:#38bdf8;padding:16px;border-radius:8px;display:block;font-family:monospace;font-size:13px;line-height:1.6\"># Enable EPEL and install google-authenticator PAM package\nsudo dnf install -y epel-release\nsudo dnf install -y google-authenticator qrencode-libs<\/code><\/pre>\n<h3 style=\"color:#38bdf8;font-size:18px;margin-top:24px;margin-bottom:12px\">2. Centralized Secret Directory Architecture<\/h3>\n<p>By default, the <code>google-authenticator<\/code> CLI stores secrets in <code>~\/.google_authenticator<\/code>. In hardened environments where home directories may reside on network storage (NFS) or have restrictive SELinux contexts, storing secrets in a dedicated local root-owned directory is standard practice. Create a secure directory structure:<\/p>\n<pre><code style=\"background:#0f172a;color:#38bdf8;padding:16px;border-radius:8px;display:block;font-family:monospace;font-size:13px;line-height:1.6\"># Create centralized PAM MFA secrets storage with strict POSIX permissions\nsudo mkdir -p \/var\/mfa-secrets\nsudo chmod 0755 \/var\/mfa-secrets\n\n# Initialize user-specific secret file with explicit ownership\nsudo install -o deployer -g deployer -m 0600 \/dev\/null \/var\/mfa-secrets\/deployer<\/code><\/pre>\n<h3 style=\"color:#38bdf8;font-size:18px;margin-top:24px;margin-bottom:12px\">3. Non-Interactive Headless Token Initialization<\/h3>\n<p>For fleet-wide infrastructure management using Ansible, Puppet, or cloud-init, run the secret generator with strict flags to generate time-based tokens, prevent reuse, enforce time-window skew restrictions, and output emergency recovery scratch codes:<\/p>\n<pre><code style=\"background:#0f172a;color:#38bdf8;padding:16px;border-radius:8px;display:block;font-family:monospace;font-size:13px;line-height:1.6\"># Generate hardened TOTP configuration non-interactively for user 'deployer'\nsudo -u deployer google-authenticator \\\n  --time-based \\\n  --disallow-reuse \\\n  --force \\\n  --rate-limit=3 \\\n  --rate-time=30 \\\n  --window-size=3 \\\n  --secret=\/var\/mfa-secrets\/deployer \\\n  --qr-mode=UTF8<\/code><\/pre>\n<p>The resulting secret file contains the base32 seed, rate-limiting metadata, and five single-use emergency scratch codes. Back up these scratch codes securely off-server.<\/p>\n<h3 style=\"color:#38bdf8;font-size:18px;margin-top:24px;margin-bottom:12px\">4. Hardening \/etc\/pam.d\/sshd<\/h3>\n<p>Next, configure the PAM subsystem for OpenSSH. Edit <code>\/etc\/pam.d\/sshd<\/code>. Comment out <code>@include common-auth<\/code> to prevent the prompt for Linux system passwords, and append the hardened Google Authenticator directive:<\/p>\n<pre><code style=\"background:#0f172a;color:#38bdf8;padding:16px;border-radius:8px;display:block;font-family:monospace;font-size:13px;line-height:1.6\"># ====================================================================\n# \/etc\/pam.d\/sshd - Production Multi-Factor Authentication Configuration\n# ====================================================================\n\n# Enforce basic account checks (shell validity, expiration, locked accounts)\naccount    required     pam_nologin.so\naccount    include      common-account\n\n# PAM Google Authenticator Module Configuration\n# nullok allows initial migration grace; remove 'nullok' once all users are enrolled\nauth [success=done new_authtok_reqd=done default=die] pam_google_authenticator.so \\\n    secret=\/var\/mfa-secrets\/${USER} \\\n    user=root \\\n    no_increment_hotp\n\n# Fallback or session handling\nsession    optional     pam_motd.so motd=\/run\/motd.dynamic\nsession    optional     pam_motd.so noupdate\nsession    include      common-session\nsession    required     pam_limits.so\nsession    required     pam_env.so<\/code><\/pre>\n<div style=\"background:#1e293b;border-left:4px solid #f59e0b;padding:16px 20px;margin:24px 0;border-radius:0 8px 8px 0;color:#e2e8f0\">\n  <strong style=\"color:#f59e0b\">Security Warning:<\/strong> During initial provisioning, the <code>nullok<\/code> parameter allows users without an MFA secret to log in with just their SSH key. Once all engineers have scanned their TOTP secrets, <strong style=\"color:#38bdf8\">remove <code>nullok<\/code> immediately<\/strong> to enforce strict zero-exception MFA for all incoming connections.\n<\/div>\n<h3 style=\"color:#38bdf8;font-size:18px;margin-top:24px;margin-bottom:12px\">5. OpenSSH Daemon Configuration Drop-in<\/h3>\n<p>Modern OpenSSH implementations support modular configuration drop-ins inside <code>\/etc\/ssh\/sshd_config.d\/<\/code>. Deploy a dedicated configuration file to mandate both public key verification and keyboard-interactive challenge execution:<\/p>\n<pre><code style=\"background:#0f172a;color:#38bdf8;padding:16px;border-radius:8px;display:block;font-family:monospace;font-size:13px;line-height:1.6\"># ====================================================================\n# \/etc\/ssh\/sshd_config.d\/99-mfa-hardening.conf\n# Production Multi-Factor Enforcement for OpenSSH\n# ====================================================================\n\n# Activate PAM integration\nUsePAM yes\n\n# Disable standard password authentication to eliminate brute-force vectors\nPasswordAuthentication no\n\n# Enable keyboard-interactive authentication to allow PAM challenge prompts\nKbdInteractiveAuthentication yes\nChallengeResponseAuthentication yes\n\n# Mandate that clients must satisfy BOTH publickey AND keyboard-interactive\n# This guarantees that private key possession alone is insufficient for login\nAuthenticationMethods publickey,keyboard-interactive:pam\n\n# Prevent PAM from injecting environment variables or running arbitrary commands\nPermitUserEnvironment no\n\n# Restrict maximum authentication attempts to mitigate brute-force guessing\nMaxAuthTries 3\nLoginGraceTime 30\n\n# Audit logging for compliance\nLogLevel VERBOSE<\/code><\/pre>\n<h3 style=\"color:#38bdf8;font-size:18px;margin-top:24px;margin-bottom:12px\">6. Conditional MFA Bypass for CI\/CD and Automation Subnets<\/h3>\n<p>Automated deployment pipelines (e.g. GitLab CI runners, GitHub Actions self-hosted runners, or backup daemons) cannot complete interactive TOTP challenges. Instead of weakening global security, implement conditional authentication methods in OpenSSH using <code>Match<\/code> blocks:<\/p>\n<pre><code style=\"background:#0f172a;color:#38bdf8;padding:16px;border-radius:8px;display:block;font-family:monospace;font-size:13px;line-height:1.6\"># ====================================================================\n# Subnet-Specific MFA Bypass for Internal Automation\n# \/etc\/ssh\/sshd_config.d\/90-automation-bypass.conf\n# ====================================================================\n\n# Dedicated automated CI\/CD runner subnet\nMatch Address 10.240.0.0\/24 User ci-deployer\n    AuthenticationMethods publickey\n    PubkeyAuthentication yes\n    KbdInteractiveAuthentication no\n\n# Management Jump Box \/ Bastion Network\nMatch Address 192.168.10.50\/32 User admin-svc\n    AuthenticationMethods publickey\n    PubkeyAuthentication yes\n    KbdInteractiveAuthentication no<\/code><\/pre>\n<h2 style=\"color:#38bdf8;font-size:24px;margin-top:32px;margin-bottom:16px\">Enterprise Failure Modes, SELinux Policies &amp; High-Availability Considerations<\/h2>\n<p>Deploying PAM MFA across production fleets introduces specific architectural edge cases that must be mitigated proactively:<\/p>\n<h3 style=\"color:#38bdf8;font-size:18px;margin-top:24px;margin-bottom:12px\">1. NTP Drift and Clock Skew Synchronization<\/h3>\n<p>RFC 6238 TOTP relies on synchronized UNIX epochs divided into 30-second steps. If host system time drifts more than 90 seconds, incoming TOTP codes will fail verification. Always enforce active time synchronization using <code>chrony<\/code> or <code>systemd-timesyncd<\/code>:<\/p>\n<pre><code style=\"background:#0f172a;color:#38bdf8;padding:16px;border-radius:8px;display:block;font-family:monospace;font-size:13px;line-height:1.6\"># Ensure chrony is active and tracking authoritative NTP servers\nsudo systemctl enable --now chronyd\nchronyc tracking<\/code><\/pre>\n<h3 style=\"color:#38bdf8;font-size:18px;margin-top:24px;margin-bottom:12px\">2. SELinux Policy Hardening for Custom Secret Paths<\/h3>\n<p>On RHEL, AlmaLinux, and Rocky Linux, storing MFA secrets outside the default home directory in <code>\/var\/mfa-secrets<\/code> triggers SELinux AVC denials when the OpenSSH daemon attempts to read the file. Remediate this by applying the correct <code>auth_home_t<\/code> file context:<\/p>\n<pre><code style=\"background:#0f172a;color:#38bdf8;padding:16px;border-radius:8px;display:block;font-family:monospace;font-size:13px;line-height:1.6\"># Apply correct SELinux context to custom MFA secrets directory\nsudo semanage fcontext -a -t auth_home_t \"\/var\/mfa-secrets(\/.*)?\"\nsudo restorecon -Rv \/var\/mfa-secrets<\/code><\/pre>\n<h3 style=\"color:#38bdf8;font-size:18px;margin-top:24px;margin-bottom:12px\">3. Preventing Lockout During Deployment<\/h3>\n<p>Before restarting the OpenSSH daemon or closing your current terminal session, validate the syntax of all configuration files and run a dry-run test instance:<\/p>\n<pre><code style=\"background:#0f172a;color:#38bdf8;padding:16px;border-radius:8px;display:block;font-family:monospace;font-size:13px;line-height:1.6\"># Validate OpenSSH configuration syntax\nsudo sshd -t\n\n# If syntax passes, reload sshd without severing established connections\nsudo systemctl reload sshd\n\n# CRITICAL: Keep your current terminal session OPEN and test authentication in a new shell:\nssh -o PreferredAuthentications=publickey,keyboard-interactive deployer@your-server-ip<\/code><\/pre>\n<h2 style=\"color:#38bdf8;font-size:24px;margin-top:32px;margin-bottom:16px\">Verification, Automated Auditing &amp; Threat Modeling<\/h2>\n<p>Once deployed, audit authentication logs to verify that PAM challenges are properly logged and enforced. Check <code>\/var\/log\/auth.log<\/code> (Debian\/Ubuntu) or <code>\/var\/log\/secure<\/code> (RHEL\/Rocky Linux):<\/p>\n<pre><code style=\"background:#0f172a;color:#38bdf8;padding:16px;border-radius:8px;display:block;font-family:monospace;font-size:13px;line-height:1.6\"># Filter SSH authentication logs for successful two-factor sessions\nsudo journalctl -u ssh -n 50 --no-pager | grep -E \"Accepted (publickey|keyboard-interactive)\"<\/code><\/pre>\n<p>A properly hardened handshake produces a dual-log sequence showing successful public key exchange immediately followed by successful PAM verification. If an attacker possesses a stolen private key but lacks the hardware authenticator, the SSH daemon terminates the session at the <code>keyboard-interactive<\/code> challenge without executing a shell or granting access.<\/p>\n<h2 style=\"color:#38bdf8;font-size:24px;margin-top:32px;margin-bottom:16px\">Frequently Asked Questions<\/h2>\n<details style=\"background:#1e293b;border:1px solid #334155;border-radius:8px;padding:14px;margin-bottom:12px\">\n<summary style=\"cursor:pointer;font-weight:600;color:#38bdf8\">Will configuring PAM MFA break automated SCP, SFTP, or rsync transfers?<\/summary>\n<p style=\"margin-top:10px;color:#cbd5e1\">Yes, standard non-interactive batch jobs cannot respond to the interactive keyboard challenge. To prevent breakage, either use dedicated service accounts restricted to specific CIDR subnets configured with <code>AuthenticationMethods publickey<\/code> inside an OpenSSH <code>Match<\/code> block, or isolate automated file synchronization jobs to restricted internal network segments.<\/p>\n<\/details>\n<details style=\"background:#1e293b;border:1px solid #334155;border-radius:8px;padding:14px;margin-bottom:12px\">\n<summary style=\"cursor:pointer;font-weight:600;color:#38bdf8\">What happens if a user loses their authenticator device or phone?<\/summary>\n<p style=\"margin-top:10px;color:#cbd5e1\">When the secret is initialized, five 8-digit emergency recovery scratch codes are generated in the user&#8217;s secret file. Each code can be entered once in place of a 6-digit TOTP token. Once used, the code is erased from the secret file. System administrators can also generate new scratch codes or re-provision secrets via root console access.<\/p>\n<\/details>\n<details style=\"background:#1e293b;border:1px solid #334155;border-radius:8px;padding:14px;margin-bottom:12px\">\n<summary style=\"cursor:pointer;font-weight:600;color:#38bdf8\">Does Google Authenticator send data back to Google servers during login?<\/summary>\n<p style=\"margin-top:10px;color:#cbd5e1\">No. The term &#8216;Google Authenticator&#8217; refers to an open-source implementation of RFC 6238 TOTP. The shared secret remains on your server, and the 6-digit token is calculated locally on the client&#8217;s authenticator app (such as Google Authenticator, Aegis, 1Password, or YubiKey). No network requests are made to external servers during authentication.<\/p>\n<\/details>\n<details style=\"background:#1e293b;border:1px solid #334155;border-radius:8px;padding:14px;margin-bottom:12px\">\n<summary style=\"cursor:pointer;font-weight:600;color:#38bdf8\">Can I use hardware security keys (FIDO2\/U2F) alongside or instead of TOTP?<\/summary>\n<p style=\"margin-top:10px;color:#cbd5e1\">Yes. Modern OpenSSH supports FIDO2 security keys natively via <code>ssh-ed25519-sk<\/code> and <code>ssh-ecdsa-sk<\/code> key types, which require physical presence verification on the hardware key itself. PAM TOTP provides a software-based zero-cost alternative or an additional secondary verification layer for environments where physical hardware tokens are not yet universally distributed.<\/p>\n<\/details>\n<div style=\"background:linear-gradient(135deg, #0f172a 0%, #1e293b 100%);border:1px solid #334155;border-radius:12px;padding:32px;margin:40px 0;text-align:center\">\n<h3 style=\"color:#ffffff;margin-top:0;font-size:22px\">Ready to Deploy High-Performance Infrastructure?<\/h3>\n<p style=\"color:#cbd5e1;font-size:16px;line-height:1.6;max-width:680px;margin:12px auto 24px auto\">Experience blazing-fast NVMe storage, unmetered bandwidth, and enterprise LiteSpeed caching on CpanelFree.<\/p>\n<p>  <a href=\"https:\/\/cpanelfree.com\" style=\"background:#38bdf8;color:#0f172a;font-weight:700;padding:12px 28px;border-radius:6px;text-decoration:none;display:inline-block;font-size:15px\">Get Started with Free Cloud Hosting &rarr;<\/a>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Harden Linux enterprise authentication by integrating PAM with Google Authenticator MFA, combining public key cryptography with TOTP for zero-trust SSH access.<\/p>\n","protected":false},"author":1,"featured_media":4661,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[172],"tags":[57,177,87,173,101],"class_list":["post-4662","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-security-hardening","tag-almalinux","tag-databases-performance","tag-devops","tag-security-hardening","tag-sysadmin"],"_links":{"self":[{"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/posts\/4662","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/comments?post=4662"}],"version-history":[{"count":0,"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/posts\/4662\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/media\/4661"}],"wp:attachment":[{"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/media?parent=4662"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/categories?post=4662"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/tags?post=4662"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}