Security checks¶
The Security page (Configure > Security) and the signalith security command
check how this server is set up: what is encrypted on the network and on disk, who can
sign in, how passwords and keys are kept, and how Signalith runs on this computer. They
say what to fix first and how, and they are honest about what Signalith can't see.
- How the checks run
- What the states mean
- In transit
- At rest
- In use
- Accounts and sign-in
- This server
- Standard or strict certificate authority
- Always on
- Not checked here
- The signalith security command
- API
How the checks run¶
- The server checks itself 30 seconds after it starts, then every hour, and after each step of a change of certificate authority. Re-check on the page runs the checks again, at most once every 10 seconds.
- A whole run takes 15 seconds at most. Each part has its own time limit, so a slow disk or a slow OpenSearch never holds up the server or a page. A part that runs out of time shows Can't tell with "Signalith couldn't finish this check in time."
- The server logs a line when what is at risk changes:
security check: at risk(a warning, with the ids of the checks) orsecurity check: nothing at risk. - Only admins can see the page and the report. It names files, folders and this server's addresses, but never shows a password, token or key.
- Every server that shares the same OpenSearch checks itself, whether or not it runs the jobs (see docs/servers.md). The page shows the counts of the others too, with a link to each one's own page.
- Many checks look at the computer itself: its disks, its files and the process.
signalith securityrun on the server as root or Administrator can see more than the service can; see The signalith security command.
What the states mean¶
| State | Meaning |
|---|---|
| At risk | Right now, someone on the network or another account on this computer could read or change Signalith's data, or sign in, without anything special. |
| Needs attention | Weaker than it should be, or a step was left half-done. Nobody gets in because of it today. |
| Can't tell | Signalith can't see this from where it runs. This is never counted as a problem. The check says how to look by hand. |
| Good | Set up safely. Some good checks have a Make it stronger tip. |
A check that doesn't apply is left out, rather than shown as "not applicable". For example, Directory sign-in appears only while directory sign-in is on.
A check with several problems shows the worst one, and lists the others under it.
Fix first lists everything at risk, then everything that needs attention, in the
order that matters most: OpenSearch open to the network and HTTPS first, then
passwords and tokens anyone can look up, then how keys are kept, then the rest. The page
shows the top three; signalith security lists them all.
In transit¶
Whether data is encrypted as it crosses the network.
HTTPS¶
Looks at: the HTTPS setting (server.tls.mode), the listen address
(server.listen) and Trusted reverse proxies (server.trusted_proxies). While HTTPS
is off behind a proxy, the server also notes computers that signed in, and agents that
sent events, directly over plain HTTP in the last day, not through the proxy. It keeps
up to 50 addresses of each, in memory only. Computers and agents on the server itself
aren't counted: what they send doesn't cross the network.
- Good: HTTPS is on; or HTTPS is off but Signalith answers only on this computer
(such as
127.0.0.1:8080); or a trusted reverse proxy serves HTTPS. - Needs attention: a proxy serves HTTPS, but people signed in, or agents sent events,
to Signalith directly over plain HTTP; or HTTPS is left to a reverse proxy that
Signalith believes only because
signalith.yamlwas written before HTTPS was the default (anhttps://public address and noserver.tlssection). List that proxy under Trusted reverse proxies. - At risk: HTTPS is off, and Signalith answers other computers directly.
To fix: turn on HTTPS, as in Upgrading from plain HTTP. Behind a proxy, set the listen address so only the proxy reaches Signalith (Behind a reverse proxy).
How to check by hand: from another computer,
curl -sI http://siem.example.com:8080/ prints Location: https://... when Signalith
serves HTTPS itself.
HTTPS certificate¶
Looks at: the certificate Signalith serves, for HTTPS or syslog over TLS: when it
expires, its key and signature, and the names it covers. With your own files, it also
looks at whether they cover the host in server.public_url and include the
certificate of the authority that issued them. With Signalith's own certificate, it
looks at when the certificate authority expires.
- At risk: the certificate has expired.
- Needs attention: it expires soon (30 days for your own files; 21 days for Signalith's own, which means renewal failed), it leaves out names people or agents use, it uses a key or signature that is too weak (RSA under 2048 bits, or SHA-1), your own certificate covers only IP addresses (so agents have no host name to check it against, see Agents and syslog), or Signalith's certificate authority expires within 180 days.
To fix: see Use your own certificate, or Names the certificate can cover. Signalith renews its own certificate by itself 30 days before it expires; if it can't, it says why in its log when it starts.
How to check by hand:
openssl s_client -connect siem.example.com:8080 -servername siem.example.com </dev/null 2>/dev/null \
| openssl x509 -noout -subject -enddate -ext subjectAltName
Certificate authority¶
Shown with Signalith's own certificate (HTTPS set to Automatic).
Looks at: how far the certificate authority in use may vouch, what
Certificate authority reaches (server.tls.ca_scope) is set to, and whether a
change of certificate authority is in progress. After a switch, it counts the computers
that refused the new certificate (from failed TLS handshakes, over HTTPS and syslog).
- Good: a standard or a strict certificate authority, whichever you chose. Neither is
better for everyone; see
Standard or strict certificate authority. One made by an earlier version
also vouches for the names under this server's names, such as
x.siem-1; the line says so, and a new one covers each name exactly. - Needs attention: a new certificate authority is ready but not switched to yet; the previous one is still kept after a switch; the one in use was made by an older version and can vouch for any website; the one in use was made by an older version and isn't limited to websites, so a stolen key could sign programs or email that computers trusting it accept; or the one in use isn't the kind you chose.
To fix: follow Switching to a new certificate authority.
How to check by hand:
sudo openssl x509 -in /var/lib/signalith/tls/ca.pem -noout -subject -enddate -ext nameConstraints,extendedKeyUsage
A standard one lists private names such as .local and .corp and private ranges. A
strict one lists only this server's names and addresses. Under Excluded, the
server's names with a dot in front keep the names under them out. No name constraints at
all means it was made by an older version. X509v3 Extended Key Usage should read
TLS Web Server Authentication alone; without it, it was made before the website-only
limit.
Agents on plain HTTP¶
Shown while HTTPS is on.
Looks at: Agents on plain HTTP (server.tls.plaintext_ingest), and which agents
sent events over plain HTTP in the last day. An agent on the server itself is counted
apart: its events don't cross the network.
- Good: agents can only send over HTTPS.
- At risk: agents on other computers still send over plain HTTP.
- Needs attention: plain HTTP is still accepted, though only agents on this computer, or none, use it.
To fix: give each agent a new configuration from Add data, then choose Refuse them. An agent that was missed keeps its events, and the Health page names it. See Upgrading from plain HTTP.
How to check by hand: the Health page lists agents that send over plain HTTP.
Syslog¶
Shown when a syslog listener is on (syslog.udp, syslog.tcp or syslog.tls).
Looks at: which listeners are on and the addresses they listen on, syslog.allow,
and how many devices sent over each protocol in the last day. A listener on a loopback
address, such as 127.0.0.1:5514, takes syslog only from this computer, so only the
others count.
- Good: syslog arrives only over TLS; or plain syslog is accepted only from this
computer, or only from the addresses in
syslog.allow. Plain syslog isn't encrypted, which is normal for devices that can't use TLS. - Needs attention: plain syslog is accepted from any computer that can reach the port. Anyone could send fake events.
- Can't tell: in Docker Desktop, every device seems to come from the same address, so Signalith can't limit who sends. Limit who reaches the port with this computer's firewall instead.
To fix: list the addresses or ranges of the devices that send syslog under
syslog.allow, such as 10.0.0.0/8. Devices that can use TLS, such as rsyslog,
syslog-ng and many firewalls, can send over TLS instead
(Agents and syslog).
How to check by hand: sudo ss -lntup | grep signalith shows the ports Signalith
listens on, and on which addresses. Check the computer's firewall for those ports.
Connection to OpenSearch¶
Looks at: the OpenSearch address (opensearch.url), whether Signalith checks
OpenSearch's certificate (opensearch.tls_skip_verify, opensearch.ca_file), whether
it sends a password, and the certificate OpenSearch presents. The demo certificate that
OpenSearch ships with is issued by Example Com Inc. Root CA; its key is public.
- Good: HTTPS with the certificate checked; or plain HTTP to OpenSearch on this computer.
- Needs attention: plain HTTP to OpenSearch on the same Docker network; or, for OpenSearch on this computer, the demo certificate or certificate checks turned off.
- At risk: certificate checks are off for OpenSearch on another computer; events or the password cross the network over plain HTTP; or OpenSearch on another computer uses the demo certificate.
To fix: see Point Signalith at it and Make the certificates.
How to check by hand:
openssl s_client -connect opensearch.example.com:9200 </dev/null 2>/dev/null | openssl x509 -noout -issuer -enddate
AI assistant and threat intel¶
Shown when the AI assistant is set up or a threat intel feed is on.
Looks at: whether the AI assistant (assistant.url) and each feed are reached over
https://, and whether a key, password or header is sent with them.
- Good: everything is reached over HTTPS, or the assistant runs on this computer.
- Needs attention: a feed is downloaded over plain HTTP, so someone on the network could change what it says.
- At risk: an API key or a feed's password crosses the network over plain HTTP.
To fix: use the https:// address of the assistant (Settings) or the feed
(Threat intel), if it has one.
Trusted reverse proxies¶
Shown when Trusted reverse proxies is set, or when Signalith believes a proxy only
because signalith.yaml was written before HTTPS was the default.
Looks at: each entry in server.trusted_proxies, and the proxies believed for the
older reason in the last day.
- Good: only the listed proxies are believed. With Client address header empty, a tip says that everyone behind them counts as one shared address for the sign-in limits, and how to count each person instead.
- Needs attention: an entry is wider than a /16 (IPv4) or /48 (IPv6), so any computer in it can claim a browser used HTTPS (and, with Client address header set, choose the address its failed sign-ins are counted under); or a proxy is believed only because of the older config.
To fix: list only the proxies' own addresses. See Behind a reverse proxy.
At rest¶
Whether stored passwords, keys and events are protected on disk.
Master key¶
Looks at: where the master key comes from (a file, a systemd credential, Windows
protection, a Docker volume or secret, or the SIGNALITH_MASTER_KEY environment
variable), who can read the key file, and whether an older key or an unused copy is
still kept. On Windows it reads the file's access list; it never trusts file modes
there.
- Good: only Signalith's account can read the key, or Windows protects it.
- Needs attention: a group can read it, it belongs to another account, it is in an environment variable, or an older key or unused copy is still kept.
- At risk: every account on this computer can read the key.
To fix: see The master key, Keeping the key elsewhere and Changing the key.
How to check by hand: sudo signalith secrets status says where the key is. On
Linux, sudo ls -l /var/lib/signalith/keys should show -rw------- and Signalith's
account. On Windows,
icacls C:\ProgramData\Signalith\keys\master.key.dpapi.
Stored passwords and keys¶
Looks at: the passwords and keys in signalith.yaml, settings.yaml,
directory.json and intel_feeds.yaml: whether each is encrypted with the master key,
and who can read a file that holds one as plain text. Values that come from environment
variables aren't stored, so they aren't counted.
- Good: every stored password and key is encrypted.
- Needs attention: some are plain text; a password is written into an address, where it can't be encrypted; some are still encrypted with the previous master key; or some can't be decrypted.
- At risk: plain text values are in a file other accounts can read.
Signalith's HTTPS keys and the Docker setup's generated secrets are protected by file permissions, not by the master key (see File permissions).
To fix: sudo signalith secrets encrypt (see
What Signalith encrypts and
Commands).
How to check by hand: sudo signalith secrets status lists each value and how it is
stored, without showing it.
Disk encryption¶
Looks at: the disks that hold Signalith's state folder, its lookups folder and its config file. Each disk is reported once.
- On Linux, it reads
/proc/self/mountinfoand/systo find the disk under each folder, and looks for an encryption layer such as LUKS (dm-crypt), eCryptfs or gocryptfs. It needs no access to/dev. Self-encrypting drives don't show this way. - On Windows, only administrators may ask whether BitLocker is on. Run
signalith securityin a PowerShell opened as Administrator: it asks Windows and saves the answer for the page. The page uses a saved answer for 30 days. -
It also notes a virtual machine (QEMU, KVM, VMware, Hyper-V, Xen, VirtualBox, Parallels and the big clouds), a network share, memory, ZFS and containers.
-
Good: the disk is encrypted, or Signalith's files are kept in memory only.
- Needs attention: a physical disk with no encryption, as far as the system can tell; or BitLocker is off or suspended.
- Can't tell: a virtual disk (its host may encrypt it), a container, a network share, ZFS, or Windows without a saved answer.
To fix: encrypt the disk, or move Signalith's folders to an encrypted one; see Disk encryption.
How to check by hand:
- Linux:
lsblk -o NAME,TYPE,FSTYPE,MOUNTPOINTS. Acryptline above the disk means it is encrypted. - Windows, as Administrator:
manage-bde -status C:, or& "$env:ProgramFiles\Signalith\signalith.exe" security, which also saves the answer for the page. - Docker Desktop: check the drive of the computer it runs on, with
manage-bde -status C:on Windows orfdesetup statuson macOS. - ZFS:
zfs get encryption <dataset>. - A virtual machine or cloud server: check the disk's settings in the provider's console, or ask whoever runs the host.
Archived days¶
Shown when the archive folder holds archives, or a retention policy archives days.
Looks at: the archive folder (retention.archive_dir): how many days it holds and
their size, who can read it, and the disk under it, as for
Disk encryption. Signalith doesn't encrypt archives itself.
- Good: on an encrypted disk, readable only by Signalith.
- Needs attention: other accounts can read the archives, or the disk isn't encrypted.
- Can't tell: Signalith can't see the disk or share under them.
To fix: keep the archive folder on an encrypted disk, readable only by Signalith; see Archives. Copies of archives you move elsewhere are only as safe as where you put them.
Where OpenSearch keeps events¶
Looks at: when OpenSearch runs on this computer and Signalith isn't in a container,
it asks OpenSearch for its data folder (path.data), with Signalith's own account, and
checks the disk under it, as for Disk encryption. A folder that
doesn't exist here (OpenSearch in a container of its own reports the container's
folder) isn't checked.
- Good: an encrypted disk, or a folder kept in memory only.
- Needs attention: a disk that isn't encrypted, as far as the system can tell.
- Can't tell: OpenSearch runs on another computer or in its own container; its folder
isn't on this computer's disks as Signalith sees them; Signalith's account may not
look inside a folder on the way (such as
/homeunder the systemd unit); or OpenSearch didn't answer.
How to check by hand: on the computer OpenSearch runs on, find path.data in
opensearch.yml and check the disk that holds it, with the commands under
Disk encryption. In the Docker quick start, events are in the
opensearch-data volume, on the disk of the computer Docker runs on.
Who can read OpenSearch¶
Looks at: whether OpenSearch answers a search with no sign-in at all. Signalith sends one request with no user name, password or client certificate, to count the events in its own indices, and gives it 5 seconds. When OpenSearch is on this computer, it also tries the same port on this computer's other addresses, to see whether OpenSearch listens on the network. If OpenSearch keeps an audit log, it records this as a refused request.
- Good: OpenSearch turns away anyone who doesn't sign in.
- Needs attention: anyone on this computer can read events, but OpenSearch doesn't listen on the network.
- At risk: anyone who can reach OpenSearch can read events without signing in.
- Can't tell: OpenSearch couldn't be reached just now. The Health page shows why.
To fix: turn on OpenSearch's security plugin with your own certificates, as in OpenSearch on Linux or Windows (or Docker quick start).
How to check by hand: this should print 401, not 200:
curl -s -o /dev/null -w '%{http_code}\n' --cacert root-ca.pem 'https://localhost:9200/signalith-*/_count'
In use¶
Whether secrets stay private while Signalith runs.
Memory¶
Looks at: on Linux, whether the process may write a crash dump (its core limit and whether it is dumpable), and whether swap could hold its memory. On Windows, whether Windows is set to keep full memory dumps of crashing programs.
- Good: Signalith's memory can't be saved in a crash dump. A tip says when swap is on and not encrypted, and when a confidential VM would protect memory from the host too.
- Needs attention: a crash dump could hold passwords.
To fix: restart Signalith with this version, which turns crash dumps off; under
systemd, keep LimitCORE=0 in the unit. On Windows, leave signalith.exe out of the
LocalDumps setting. See In use.
How to check by hand:
- Linux:
grep 'core file' /proc/$(systemctl show -p MainPID --value signalith)/limitsshows0, andswapon --showlists swap. - Windows:
reg query "HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /s.
Confidential virtual machine¶
Shown only when found, on Linux: AMD SEV-SNP (/sys/class/misc/sev-guest) or Intel TDX
(/sys/class/misc/tdx_guest, or tdx_guest in /proc/cpuinfo). Such a machine is built
to keep even its host from reading its memory. Some platforms hide these markers, so
not finding one proves nothing, and Signalith doesn't report it as a problem.
How to check by hand: your cloud provider's console says whether the VM is confidential.
Accounts and sign-in¶
Who can sign in, and how well passwords and tokens are kept.
Built-in admin's password¶
Looks at: whether the built-in admin still has the public example password, the
first password the Docker setup made, a password set in the SIGNALITH_ADMIN_PASSWORD
environment variable, or one read from the file in SIGNALITH_ADMIN_PASSWORD_FILE; and
how strongly it is hashed.
- Good: it has a password of its own.
- Needs attention: the Docker setup's first password, which is kept as plain text in a Docker volume; a password in an environment variable, or in a file named by one; or an older, weaker hash.
- At risk: the example password
change-me-please, which anyone can look up.
To fix: sudo signalith passwd, then restart Signalith; see
The built-in admin.
Everyday sign-in¶
Looks at: when the built-in admin last signed in, and how many other people have admin accounts.
- Good: people sign in with their own accounts, or only the built-in admin exists so far (with a tip to give yourself an account, so the audit log shows who did what).
- Needs attention: the built-in admin signed in during the last 7 days, though others have admin accounts. Keep it for emergencies.
To fix: see The built-in admin.
Temporary passwords¶
Shown when there are local users.
Looks at: enabled local users who still have the temporary password they were given more than 7 days ago.
To fix: remind them to sign in and choose a password, or disable their account until they need it (Managing local users).
Directory sign-in¶
Shown while directory sign-in is on.
Looks at: the directory addresses (main and failover): ldaps://, or ldap:// with
StartTLS, and whether Signalith checks the directory server's certificate.
- Good: passwords go to the directory encrypted, and its certificate is checked.
- At risk:
ldap://without StartTLS, so passwords cross the network unencrypted; or certificate checks are off, so someone could pose as the directory and collect passwords.
To fix: use an ldaps:// address or turn on StartTLS, give the directory's CA
certificate, and turn off Skip certificate check
(Set it up).
How to check by hand:
openssl s_client -connect dc1.corp.example.com:636 </dev/null 2>/dev/null | openssl x509 -noout -subject -issuer.
Sign-in sessions¶
Looks at: Sign out after (auth.session_timeout, 12 hours by default): how
long a sign-in lasts without use. An open tab's own refreshes (the Health card,
dashboards and other timers) don't count as use, so a tab left unattended still signs
out. Someone who ticks Keep me signed in isn't signed
out for being idle; every sign-in ends after 7 days at most.
- Good: 24 hours or less.
- Needs attention: longer than 24 hours.
To fix: set Sign out after to 12h or less on the Settings page.
Agent tokens¶
Shown when there are agent tokens: tokens made on Add data or with
signalith tokens, or shared tokens from signalith.yaml (ingest.tokens),
SIGNALITH_INGEST_TOKEN or SIGNALITH_INGEST_TOKEN_FILE. See
agent-tokens.md.
Looks at: whether a shared token (one every agent uses) is still accepted, when an agent last sent with it, how long it is, and whether it is the public example token. A shared token copied from any one agent works for all of them, and can't be turned off for one agent alone.
- Good: no shared token is accepted; each agent group sends with its own token ("Each agent group sends with its own token (N active)."). A shared token you chose Stop accepting on counts as retired, even while it is still in the configuration.
- Good, with a tip: a shared token is accepted but no agent has ever sent with it, and either agent tokens exist or this is the Docker quick start, whose setup step makes one ("No agent sends with a shared token, though one is still accepted."). The tip says to choose Stop accepting on it.
- Needs attention:
- a shared token is accepted and an agent sent with it in the last 7 days ("Some agents still send with a shared token, so a copy taken from any one of them works for all of them.");
- a shared token is accepted though no agent has used it in the last 7 days;
- a shared token is shorter than 24 characters;
- a shared token is accepted and the tokens couldn't be read from OpenSearch, so how it was used isn't known.
- At risk: the example token
change-this-ingest-token, which anyone can look up, is accepted. On a Docker quick start upgraded from an older version, whose agents all have it, Signalith accepts it from them over plain HTTP while Agents on plain HTTP accepts them, even when it isn't iningest.tokens. Choose Refuse them once every agent has its configuration from Add data; that ends it for good. - Can't tell: the agent tokens couldn't be read from OpenSearch (for example when
signalith securityruns while OpenSearch is down).
On the Docker quick start the check also says why the old example token is refused: the install started new, it was upgraded and agents on plain HTTP were refused since a date, or Signalith couldn't yet ask OpenSearch which it is. See The Docker quick start's old example token.
To fix:
- Open Add data and give each agent a configuration with its own token.
- Under Agent tokens, choose Stop accepting on the shared token once its Last used is older than the last agent you updated.
- That's all. You may also delete it from signalith.yaml (
ingest.tokens) orSIGNALITH_INGEST_TOKEN; on the Docker quick start, leavedocker-compose.ymlas it is.
Signalith's OpenSearch account¶
Shown when OpenSearch requires sign-in and has its security plugin.
Looks at: what OpenSearch says Signalith's account may do
(/_plugins/_security/authinfo), and whether Signalith signs in as admin with the demo
password admin. The password is compared in memory and never shown.
- Good: an account without admin rights.
- Needs attention: an account that can do anything in OpenSearch (
all_access,security_manageror theadminbackend role). - At risk:
adminwith the passwordadmin. - Can't tell: OpenSearch couldn't be reached, or didn't say.
To fix: give Signalith its own account with the signalith_server role, ideally
signing in with a certificate
(Load the security settings).
How to check by hand:
curl -s --cacert root-ca.pem --cert signalith.pem --key signalith-key.pem 'https://localhost:9200/_plugins/_security/authinfo?pretty'
This server¶
How Signalith runs on this computer.
Account Signalith runs as¶
Looks at: the account of the Signalith process: root or not on Linux and in containers, and on Windows whether it is Local System, an administrator, or its own service account.
- Good: its own account (
signalithunder systemd,NT SERVICE\Signalithon Windows), or an unprivileged account in a container. - Needs attention: root, Local System or an administrator, so a flaw in Signalith could reach the whole computer.
- Can't tell: on Windows, the service runs as an account Windows couldn't say is an administrator or not, such as a domain account while the domain can't be reached.
To fix: on Linux, install the systemd unit from Linux; on
Windows, run install.ps1 from this version again (Windows). In
Docker, remove a user: line that overrides the image's account.
How to check by hand:
- Linux:
ps -o user= -p $(systemctl show -p MainPID --value signalith). - Windows:
sc.exe qc SignalithshowsSERVICE_START_NAME. - Docker:
docker compose -f deploy/docker/docker-compose.yml exec signalith id.
Service protections¶
Shown on Linux. On Windows, Account Signalith runs as covers the service.
Looks at: the protections the systemd unit in deploy/systemd sets up, as the
process sees them: no new privileges, a system-call filter, no extra capabilities, a
read-only system, hidden processes, a private /dev and private new files. In a
container: no new privileges, no capabilities, a read-only system and no core dumps.
- Good: all of them are in place. Linux before 5.8 can't hide processes, so there it isn't counted as missing.
- Needs attention: some are missing, or Signalith doesn't run as a systemd service.
To fix: install the current unit and restart, as in Linux. If
you changed the unit on purpose, compare it with systemctl cat signalith. In Docker,
keep read_only: true, cap_drop: [ALL], security_opt: [no-new-privileges:true] and
ulimits: core: 0 in docker-compose.yml.
How to check by hand: systemd-analyze security signalith.
File permissions¶
Looks at: who may read or change Signalith's keys (the HTTPS keys in tls/, the
sign-in key signin.key, a key file for OpenSearch, and the files named by
SIGNALITH_*_FILE variables), its private
files (users.json, directory.json, settings.yaml, intel_feeds.yaml, the admin
password hash), its folders, and signalith.yaml with its folder. The master key is
left to Master key. On Windows it reads each file's access list; on Linux
and macOS, the owner and mode.
- Good: only Signalith's account (and administrators) can change them, and only they
can read the keys and private files. For
signalith.yamland the folders, it looks only at who can change them. Whether others can read plain passwords insignalith.yamlis part of Stored passwords and keys. - Needs attention: a group or other accounts can read private files, or a group can change a folder; or the state folder is on a network share, so keys cross the network each time they are read.
- At risk: every account can read a key, or change the config or a folder.
To fix: the check gives the exact commands for each file. On Linux,
sudo chmod -R go-rwx /var/lib/signalith covers the state folder. On Windows, running
install.ps1 from this version again resets access in C:\ProgramData\Signalith. Keep
the state folder on a local disk (Identity).
How to check by hand:
- Linux:
sudo ls -la /var/lib/signalith /var/lib/signalith/tls /etc/signalith. - Windows:
icacls C:\ProgramData\Signalith /t.
Standard or strict certificate authority¶
With Signalith's own certificate, computers that trust its certificate authority accept
any certificate it makes. Certificate authority reaches (server.tls.ca_scope)
chooses how far that goes. Neither choice lets it vouch for other public websites: of
public names, only this server's own, each exactly.
- Standard, the default, can also vouch for private network names and addresses,
such as
intranet.corpor192.168.1.5. A new address for this server works right away. - Strict can vouch only for this server's own names and addresses. A stolen key then lets someone pose only as this server's website, but a new name or address later means a new certificate authority, which every browser and agent must trust again.
Strict suits a server whose name and address won't change, especially when many computers trust it. Both are Good on the page. The setting only applies to a certificate authority made from now on; see How far the certificate authority reaches and Switching to a new certificate authority.
Always on¶
The report also lists protections that can't be turned off, as they apply to this server:
- With HTTPS on, passwords, API sign-ins and sessions are refused over plain HTTP, and the sign-in cookie is sent over HTTPS only.
- With HTTPS on, browsers that reach Signalith by name are told to use HTTPS only (HSTS).
- Every page has a strict Content Security Policy and can't be shown inside another site.
- Guessing passwords is slowed: after 10 wrong tries for one account from one address in 15 minutes, sign-in pauses for 15 minutes. The API is limited the same way.
- Sign-ins end after 7 days at most, even with Keep me signed in.
- Passwords are stored only as bcrypt hashes.
- Logs, pages and the API never show stored passwords or keys.
- With HTTPS on, agents set up from Add data check the server's certificate before sending.
- Sign-ins, sign-outs and every change to users and settings go to the audit log.
Not checked here¶
Signalith can't see these, so it says so once rather than showing Can't tell for them every time:
- Firewalls: which computers can reach Signalith's ports (8080 by default, and the syslog ports) and OpenSearch's (9200 by default). Check the firewall of this computer and of the network.
- Backups, and whether the master key is kept apart from them (see Backing up the key).
- Updates for Signalith, OpenSearch and the operating system. Signalith doesn't contact the internet to check.
- Two-step sign-in. Signalith has none of its own.
- The computers agents run on.
- Copies of events outside Signalith, such as exports, moved archives and OpenSearch snapshots.
The signalith security command¶
It runs the same checks as the page, from the files and processes on this computer, and prints the report as plain text: a summary, Fix first with the commands for this kind of install, then every check by group. Docs links are printed in full.
- On Linux it uses the folders, files and master key the service is given in its systemd
unit, like
validate,settingsandsecretsdo, and looks at the running service's process. In Docker it looks at the container's first process. When it finds no running service for the config file (it is stopped, or was started another way), the checks of the process say so. The Security page checks them either way. - On Windows, run as Administrator, it also asks whether BitLocker is on and saves the answer for the page. It says so on standard error, so the report itself stays the same.
- It can't see what only the running server sees: agents and devices that sent in the last day, sign-ins over plain HTTP, and computers that refused a new certificate. The checks that need those say so, rather than claiming "none". The page has them.
- Without root or Administrator, it may not be able to read the config file. It then
stops and says to run it with
sudoor as Administrator. A folder or file it can't read makes that check Can't tell. -jsonprints the same JSON asGET /api/security, without what only the running server sees (others,seen_namesandrefusals). Notes go to standard error, so the output stays JSON.
Exit codes, for scripts and monitoring:
| Code | Meaning |
|---|---|
0 |
Nothing is at risk. |
2 |
Something is at risk. |
1 |
The command couldn't run, for example the config file couldn't be read. |
Needs attention and Can't tell never change the exit code.
API¶
Both routes are for admins only.
GET /api/securityreturns the last report as JSON. It never waits for a new run, unless there is no report yet.?recheck=1runs the checks again first (at most once every 10 seconds).?format=textreturns the plain text report, and&download=1saves it as a file.POST /api/security/catakes the steps of a change of certificate authority:{"action": "prepare"}(with"scope": "standard"or"strict"to changeserver.tls.ca_scopetoo),switch,rollback,discardorprune. It returns the new report. See Switching to a new certificate authority.
The report has checked_at, server, summary (counts by state), fix_first (check
ids), groups, checks, always_on, not_checked, and, with Signalith's own
certificate, ca. Each check has its id, group, title, state (risk,
attention, unknown or good), line, details, and a fix or tip with steps,
a setting, a page, commands and a docs link.