Today, I will show you how to put every connected USB storage device in read-only mode using udev dynamic device management, blockdev utility, and systemd service unit configuration.

udev

The simplest solution is to create an udev rule to directly execute blockdev command, which will enforce read-only mode on every connected USB storage device.
It will work on Debian Wheezy and Debian Jessie as well.

Create an udev rule.

$ cat << EOF | sudo tee /etc/udev/rules.d/10-usb-ro.rules
SUBSYSTEMS=="usb",ACTION=="add",KERNEL=="sd*",RUN+="/sbin/blockdev --setro /dev/%k"
EOF

Reload udev configuration files afterward.

$ sudo udevadm control --reload

udev and systemd

This solution will use systemd service unit configuration to execute above-mentioned blockdev command. It will work on Debian Jessie.

Create an udev rule.

$ cat << EOF | sudo tee /etc/udev/rules.d/10-usb-ro.rules
SUBSYSTEMS=="usb",ACTION=="add",KERNEL=="sd*",ENV{SYSTEMD_WANTS}="enforce-usb-ro@%k"
EOF

Create the systemd template.

$ cat << EOF | sudo tee /etc/systemd/system/enforce-usb-ro\@.service
[Unit]
Description=Enforce read-only mode on USB storage device
BindsTo=dev-%i.device
[Service]
Type=simple
ExecStart=/sbin/blockdev --setro /dev/%I
EOF

Reload udev configuration files afterward.

$ sudo udevadm control --reload

Reload systemd configuration files too.

$ sudo systemctl daemon-reload

Additional notes

Notice that created rules will be applied only to newly connected devices.

Use the following command to verify read-only mode on connected devices.

$ sudo blockdev --report
RO    RA   SSZ   BSZ   StartSec            Size   Device
rw   256   512   512          0      1073741312   /dev/sr0
rw   256   512  4096          0      8589934592   /dev/sda
rw   256   512  4096       2048      8185184256   /dev/sda1
rw   256   512  1024   15990782            1024   /dev/sda2
rw   256   512  4096   15990784       401604608   /dev/sda5
ro   256   512  4096          0     15518924800   /dev/sdb
ko-fi