Securing FrameworX deployments for production environments.
Parent Page: Deployment (Reference)
For domain environments:
xml
<authentication mode="Windows">
<domain>COMPANY</domain>
<allowedGroups>
<group>SCADA_Operators</group>
<group>SCADA_Engineers</group>
</allowedGroups>
</authentication>
For non-domain:
xml
<authentication mode="Forms">
<passwordPolicy>
<minLength>12</minLength>
<requireUppercase>true</requireUppercase>
<requireNumbers>true</requireNumbers>
<requireSpecialChars>true</requireSpecialChars>
<expirationDays>90</expirationDays>
</passwordPolicy>
</authentication>
Configure MFA provider:
xml
<mfa enabled="true">
<provider>AzureAD</provider>
<timeout>300</timeout>
</mfa>
Generate Certificate:
powershell
New-SelfSignedCertificate `
-DnsName "scada.company.com" `
-CertStoreLocation "cert:\LocalMachine\My"
Bind to Service:
cmd
netsh http add sslcert ipport=0.0.0.0:10108
certhash=<thumbprint>
appid={12345678-1234-1234-1234-123456789012}
Minimal Access:
powershell
# Remove default allow-all
Remove-NetFirewallRule -DisplayName "FrameworX*"
# Add specific rules
New-NetFirewallRule -DisplayName "FrameworX Clients" `
-Direction Inbound -Protocol TCP -LocalPort 10108 `
-RemoteAddress 192.168.1.0/24 -Action Allow
Define Roles:
xml
<roles>
<role name="Operator">
<permissions>
<allow>Display.View</allow>
<allow>Alarms.Acknowledge</allow>
<deny>Configuration.*</deny>
</permissions>
</role>
<role name="Engineer">
<permissions>
<allow>*</allow>
<deny>Security.Modify</deny>
</permissions>
</role>
</roles>
Protect critical tags:
xml
<tagSecurity>
<tag name="Emergency_Stop">
<writeAccess>Engineers,Supervisors</writeAccess>
<audit>true</audit>
</tag>
</tagSecurity>
SQL Server TDE:
sql
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'StrongPassword123!';
CREATE CERTIFICATE FrameworXCert WITH SUBJECT = 'FrameworX TDE';
CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_256
ENCRYPTION BY SERVER CERTIFICATE FrameworXCert;
ALTER DATABASE FrameworX SET ENCRYPTION ON;
Device Connections:
xml
<deviceSecurity>
<protocol name="OPC_UA">
<security>SignAndEncrypt</security>
<certificate>device-cert.pfx</certificate>
</protocol>
</deviceSecurity>
xml
<audit enabled="true">
<events>
<login>true</login>
<logout>true</logout>
<configChange>true</configChange>
<tagWrite>true</tagWrite>
<alarmAck>true</alarmAck>
</events>
<storage>
<path>C:\Logs\Audit\</path>
<retention>365</retention>
</storage>
</audit>
Generate for:
powershell
# Disable unnecessary services
Stop-Service -Name "Spooler"
Set-Service -Name "Spooler" -StartupType Disabled
# Configure security policies
secedit /configure /db security.sdb /cfg security.inf
# Enable Windows Defender
Set-MpPreference -DisableRealtimeMonitoring $false
bash
# Disable root login
sed -i 's/PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
# Configure firewall
ufw default deny incoming
ufw allow from 192.168.1.0/24 to any port 10108
ufw enable
# Set file permissions
chmod 750 /opt/frameworkx
chown -R frameworkx:frameworkx /opt/frameworkx
Monitor for: