Skip to main content
Call Eric:863-698-8266
CURRYCONTROLS.COMControls & Automation Knowledge Hub
ReferenceCybersecurityPLCProgramming

Controller Hardening

What can be locked down on a PLC or RTU: keyswitch and mode, credentials, unused services, access lists, firmware, and the engineering workstation that is the real target.

12 min readUpdated Sep 5, 2026Published Sep 5, 2026By Eric Sullivan

The short answer

Controller Hardening

Hardening a controller means removing every capability an attacker could use that the process does not need: leave the keyswitch in RUN, protect the project and the controller with credentials, disable the web server, FTP, Telnet, and default SNMP communities, restrict which addresses may connect where the controller supports it, keep firmware current on a tested schedule, and treat the engineering workstation as part of the controller. For controllers that offer none of this, the network around them provides the protection.

Key points

  • A PLC is only as secure as the laptop that can program it.
  • Keyswitch in RUN, mode changes alarmed, program changes detected.
  • Disable every service the process does not use. Most ship enabled.
  • Where the controller cannot protect itself, the firewall in front of it must.
  • Write the program so that bad data and unexpected commands are caught in logic.

What a controller can and cannot do

Programmable controllers were designed to be easy to reach. Their protocols assume a trusted network, many of them accept a program download from anyone who can send the right packets, and a controller from fifteen years ago may have no concept of a user at all. Newer platforms add real controls: signed firmware, authenticated protocols, role-based access, and integrity checks. Hardening is the work of using whatever the controller has, and surrounding it with network controls for whatever it lacks.

The controller is also not the most likely target. The engineering workstation that holds the programming software and the project files can change any controller it reaches, and it is a Windows machine with a browser. Hardening that starts at the controller and forgets the workstation has locked the vault and left the key on the counter.

Hardening measures

MeasureWhat it doesNotes
Keyswitch in RUNPrevents program download and mode change from the network on controllers with a physical switchThe single most effective control on a legacy controller. Remote mode change is convenient exactly when it should not be possible.
Controller access credentialsRequires authentication to connect, view, or modifyNamed users where the platform supports them; otherwise a strong controller password held by the utility, not the vendor.
Project and source protectionPrevents an attacker who obtains the project file from reading or modifying itProtect the file, and keep the unprotected master in the engineering backup store, not on the laptop.
Disable unused servicesCloses the web server, FTP, Telnet, SNMP, email, and vendor discovery protocols that ship enabledEach one is a login prompt or a data leak. Turn off what the process does not use; document what stays on and why.
Change default credentialsRemoves the passwords printed in the manualWeb servers, SNMP community strings, and embedded switches all ship with defaults.
Access control listsRestricts which addresses can reach the controller, or which can writeAvailable on many current controllers and on managed switches in front of older ones.
Authenticated protocolsUses the secure variants where both ends support themCIP Security, OPC UA with certificates, DNP3 secure authentication. Requires the SCADA side to support it too.
Firmware currencyRemoves known vulnerabilitiesOn a tested schedule, with the program backed up, during a planned outage. Firmware is never updated on a live process on a whim.
Remove unused logic and tagsReduces what an attacker can influence and what an operator can misreadOld test routines and forcing blocks are a favorite place to hide a change.
Physical protectionLocks the enclosure and the portA controller with the door open in an unlocked building is reachable by anyone with a laptop, whatever the network says.

Mode and change monitoring

Two things about a controller are worth alarming in SCADA at all times: its mode, and whether its program has changed. A controller that leaves RUN when no one is scheduled to work on it, or whose program checksum changes, is either being maintained without a change record or is under attack, and both deserve a call. Most platforms expose mode, a program checksum or change counter, and the time of last edit as readable status. Log them, alarm on change, and compare the checksum to the last approved backup.

Programming for security

Hardening is not only configuration. How the program is written determines what an attacker who reaches the controller, or the HMI that writes to it, can actually cause. The community-maintained Top 20 Secure PLC Coding Practices collects the useful ones; the following apply to almost every water and wastewater program.

  • Validate every input and every written setpoint against a physical range. A chemical feed setpoint of ten times the maximum is rejected in logic, not obeyed.
  • Keep operational logic in the controller, not the HMI. The HMI writes a setpoint or a command; the controller decides whether to act on it and enforces the limits and interlocks itself.
  • Restrict HMI writes to a defined set of tags. Nothing outside the command and setpoint list is writable from the network, and the program does not read commands from tags that are not on the list.
  • Use plausibility checks between related signals: a pump that shows running with zero current, a flow with the valve closed, a level that changes faster than the well can. Alarm the disagreement.
  • Alarm on mode change, on program change, on a hard stop, and on a restart. Count restarts and alarm the count.
  • Do not leave forces, test bits, or simulation modes in a production program. If a simulation mode is needed, make it visible on every HMI screen while active.
  • Log significant events in the controller with timestamps, not only in SCADA, so an investigation has a record that survives the SCADA server.
  • Fail to a safe state on loss of communication. The controller runs the process on its own; a lost HMI does not leave a valve where an attacker left it.

Controllers with no security

A large share of the installed base cannot be hardened much: no credentials, no services to disable, a protocol that accepts any command. The controls for these are around the controller.

  1. 01A firewall or a managed switch with an access list directly in front of the controller, allowing the SCADA master and the engineering zone only, on the protocol ports only.
  2. 02Deep packet inspection on the conduit where it is available, so that the firewall can allow reads and block writes or program downloads from anything other than the engineering workstation.
  3. 03Keyswitch in RUN, which most of these controllers do have.
  4. 04A program integrity check from the engineering side: a scheduled upload compared with the approved backup.
  5. 05A replacement plan. A controller that cannot be secured and cannot be isolated is a risk with a date on it.

The engineering workstation

The machine that programs the controllers is the most powerful device on the control network. It should be a dedicated machine, never the same laptop used for email and the web, in its own zone with a logged conduit to the control zone, with its own named accounts and MFA, with the programming software kept current, with removable media controlled, and with the project files backed up to a store the workstation cannot silently overwrite. An integrator laptop that programs many customers is a shared conduit between all of them; the on-site access rules on the vendor remote access page apply to it.

Frequently asked questions

Does hardening risk breaking the process?
Some measures do, which is why each one is tested. Disabling a service that the HMI was quietly using, or enabling an access list that omits the historian, stops data. Do the work on a documented plan during a maintenance window, one controller at a time, with the program backed up and a rollback ready. Keyswitch to RUN and default password changes are safe on any working system.
Should firmware always be current?
Current within a tested schedule. A firmware update on a controller is a change to a running process and can change behavior; it goes through the same testing and outage planning as a program change. What is not acceptable is a controller on a firmware version with a known remotely exploitable vulnerability and no compensating control in front of it.
Is the controller password enough?
No. It is one layer, and on many platforms it protects the project file more than the controller. The network access list and the keyswitch are the layers that stop an attacker who never had the file.
Where do I start on a system with two hundred controllers?
With the inventory: which controllers, which firmware, which services, which mode. Then keyswitches to RUN and default credentials changed everywhere, because those are cheap and safe. Then the network access lists on the conduits, starting with the zones the risk assessment ranked highest.

Direct contact

Have a controls question?

Reach Eric Sullivan directly about anything on this site, a controls or automation topic, or one of his personal projects.