HomeTopicsAuthentication › Failures & Lockouts

Reading Auth Failures and Designing Lockouts

Put a transfer server on the internet and within hours its log begins filling with failed logins. New administrators react in one of two wrong ways: panic — treating every failure as an attack in progress — or, a few weeks later, numbness, scrolling past everything including the entry that mattered. Both reactions come from the same gap: failed logins are not one thing. A typo, a scheduled job running on a stale password, a brute-force run, and a careful low-and-slow campaign all land in the same log, and they look completely different once you know the signatures.

Reading those signatures is the first half of this article. The second half is what you build with that knowledge: lockout and throttling rules that make password guessing uneconomical without handing attackers a way to shut off your own partners — because a badly designed lockout policy does exactly that, locking the victim account while the attacker shrugs and moves on.

This article — part of our Authentication on Transfer Endpoints series — gives you annotated log excerpts for each signature, starting numbers for thresholds, an alerting shortlist that fires on patterns instead of noise, and a runbook for the day a partner locks themselves out.

The Anatomy of a Failed Login Line

Every useful authentication log line answers five questions: when (timestamp), who was claimed (the account name presented), from where (source IP address), over what (protocol or interface — FTP, FTPS, SFTP, HTTPS, admin console), and what happened (success, or failure with a reason: bad password, unknown user, key rejected). Formats differ by server, but the fields are universal, and a server that omits one of them is blinding you. A Windows transfer server such as Sysax Multi Server records login attempts per account across all of its protocols in its activity log, which is exactly the raw material this article works with.

Single lines, though, tell you almost nothing — the signature lives in the pattern across lines: how many accounts, how many sources, what tempo, and whether a success ever appears. The excerpts below use a simplified neutral format so the patterns stand out; your server's log will differ cosmetically and match structurally. Getting logs collected, kept, and searchable in the first place is its own discipline, covered in our transfer logging and audit series.

The Four Signatures, Annotated

Signature 1: the human typo

The most common failure in any log, and the one your lockout policy must forgive gracefully:

Tue 09:12:31  AUTH FAIL  user=jmorris      ip=10.4.2.17      proto=SFTP   reason=bad password
Tue 09:12:44  AUTH FAIL  user=jmorris      ip=10.4.2.17      proto=SFTP   reason=bad password
Tue 09:13:02  AUTH OK    user=jmorris      ip=10.4.2.17      proto=SFTP

The tells: one known account, one familiar source address (here an internal one), two or three failures a few seconds apart — human-speed, not machine-speed — during working hours, ending in a success. Someone fat-fingered a password, swore quietly, and got it right on the third try. A variant ends not in success but in silence followed by a helpdesk ticket: that is a forgotten password, not an incident. Neither deserves a lockout, an alert, or a second of investigation.

Signature 2: the stale credential

The most common "attack" you will ever investigate is your own scheduler, or a partner's:

Tue 02:00:03  AUTH FAIL  user=acme-orders  ip=203.0.113.77   proto=SFTP   reason=bad password
Tue 02:15:03  AUTH FAIL  user=acme-orders  ip=203.0.113.77   proto=SFTP   reason=bad password
Tue 02:30:03  AUTH FAIL  user=acme-orders  ip=203.0.113.77   proto=SFTP   reason=bad password
Tue 02:45:03  AUTH FAIL  user=acme-orders  ip=203.0.113.77   proto=SFTP   reason=bad password
    ... identical, every 15 minutes, around the clock, for days ...

The tells: metronome regularity — the same second of every interval, because a scheduler is doing the retrying; one account, one source, and that source is the expected one for the account; no success, ever; and a start time that, if you check, coincides suspiciously with a credential rotation or a config change. No human fails a login at 2:00 a.m. and again at exactly 2:15:03. This is automation faithfully presenting a password that stopped being valid — usually because a rotation was completed on the server but never propagated to the job, the failure mode the overlap window in the partner credential lifecycle exists to prevent. It is noise to an attacker-hunter but urgent to the business: whatever that job was supposed to transfer is not moving.

Signature 3: brute force on one target

The classic attack signature — one source hammering one door:

Tue 03:41:07  AUTH FAIL  user=admin        ip=198.51.100.23  proto=FTP    reason=bad password
Tue 03:41:08  AUTH FAIL  user=admin        ip=198.51.100.23  proto=FTP    reason=bad password
Tue 03:41:09  AUTH FAIL  user=admin        ip=198.51.100.23  proto=FTP    reason=bad password
Tue 03:41:11  AUTH FAIL  user=root         ip=198.51.100.23  proto=FTP    reason=unknown user
Tue 03:41:12  AUTH FAIL  user=ftpuser      ip=198.51.100.23  proto=FTP    reason=unknown user
Tue 03:41:13  AUTH FAIL  user=test         ip=198.51.100.23  proto=FTP    reason=unknown user
    ... hundreds to thousands of attempts, machine-paced ...

The tells: machine tempo — multiple attempts per second, no human pause; a single unfamiliar source; and target accounts drawn from the universal guess list — admin, root, test, ftp, backup — many of which do not exist on your server, hence the unknown user reasons. This is opportunistic scanning that every internet-facing endpoint receives; the sender is running down a list of addresses, not studying you. It looks dramatic and is the easiest signature to defend against: per-source throttling shuts it down mechanically, and accounts with real names and real passwords are not meaningfully at risk from it. The full defense stack — including automatic source banning — is the subject of our brute force protection series.

Signature 4: the low-and-slow spray

The signature that per-account thresholds are structurally blind to:

Tue 04:02:19  AUTH FAIL  user=acme-orders  ip=192.0.2.140    proto=SFTP   reason=bad password
Tue 04:09:47  AUTH FAIL  user=payroll-push ip=192.0.2.140    proto=SFTP   reason=bad password
Tue 04:17:02  AUTH FAIL  user=jmorris      ip=192.0.2.140    proto=SFTP   reason=bad password
Tue 04:24:55  AUTH FAIL  user=bravo-inv    ip=192.0.2.140    proto=SFTP   reason=bad password
Tue 04:31:36  AUTH FAIL  user=dwhite       ip=192.0.2.140    proto=SFTP   reason=bad password
    ... one or two tries per account, many accounts, for hours ...

The tells: many valid account names — which means the attacker has learned your naming somehow, making this more targeted than signature 3 — but only one or two attempts against each, spaced out politely. This is password spraying: trying one likely password across many accounts, precisely tuned to stay under per-account lockout thresholds. Viewed account by account, each entry looks like a lone typo; viewed by source, one address has now failed against a dozen different accounts, which no legitimate anything ever does. That rotated perspective — counting failures per source and per time window, not just per account — is what catches it. A patient attacker spreads the same pattern across multiple source addresses and days, which is why the aggregate view ("distinct accounts failed against, per source, per day") belongs in your routine log review rather than only in real-time rules.

The Signatures at a Glance

Pattern Accounts Sources Tempo Ends in success? Verdict
Typo One, known One, familiar Human: seconds apart, 2–3 tries Usually Ignore
Stale credential One, service or partner One, the expected one Metronome: exact intervals, all hours Never Fix the job or call the partner
Brute force One or a guess-list, many nonexistent One or few, unfamiliar Machine: many per second Goal, rarely achieved Throttle or ban the source
Spray Many, valid One or several Slow and even, 1–2 tries per account Goal — watch for it Investigate: targeted, knows your accounts

Remember: the single most important line in any authentication log is a success that follows a streak of failures on the same account. That is the moment guessing may have worked. A lockout that fires after that success is a smoke alarm that beeps after the fire — the success line is what your alerting must catch.

Lockout Design: Stopping Attacks Without Punishing Partners

A lockout temporarily disables logins for an account after too many failures; throttling slows or blocks attempts from a source instead. They exist to break the economics of guessing — an attacker who gets five tries per hour instead of five per second needs centuries. But the naive version, "lock any account after a few failures until an admin unlocks it," creates two problems bigger than the one it solves.

First, a hard per-account lockout is a denial-of-service switch that anyone on the internet can flip. An attacker who knows or guesses your partner's account name — and account names are the guessable half of a credential — can deliberately fail a handful of logins against it and lock your partner out of their own flow. The account being attacked is the victim; permanent-until-admin lockout punishes the victim while costing the attacker nothing. Second, the stale-credential signature above walks straight into per-account lockouts: a partner whose job retries a dead password every fifteen minutes locks the account before anyone has read the log, converting a config error into an outage.

Design around both problems with three principles:

  • Count per source first. The offending unit in signatures 3 and 4 is the source address, not the account. Throttle and ban misbehaving sources — the automated, fail2ban-style version of this is covered in brute force protection — and most internet noise disappears without any account ever locking.
  • Make per-account lockouts soft. Generous threshold, automatic expiry after minutes, never permanent, and always paired with a notification so a lockout is a signal someone sees rather than a silent outage. Progressive delay — each failure adding seconds before the next attempt is accepted — achieves the same economics with no lockout state to manage at all.
  • Change the math for known-source accounts. A partner or service account restricted to its known source addresses can only accumulate failures from those addresses — the internet cannot touch it, so the lockout question barely arises. Allowlisting is the quiet prerequisite that makes gentle lockout policies safe.

Starting Numbers

Every environment tunes differently, but tuning needs a starting point. These defaults are deliberately conservative in both directions — hard on sources, forgiving on accounts — and safe to adopt as written, then adjust against a month of your own log data:

LOCKOUT AND THROTTLING STANDARD - STARTING VALUES

Per SOURCE (primary control):
  10 failures within 5 minutes  -> block source for 30 minutes
  3 blocks in 24 hours          -> block source for 24 hours
  Applies to all protocols; admin interface counts double.

Per ACCOUNT (safety net, soft):
  10 failures within 15 minutes -> lock account 15 minutes,
                                   auto-unlock, notify admins
  Never permanent. Manual-unlock-only is reserved for
  confirmed-incident response, not for policy.

Admin console:
  5 failures within 15 minutes  -> lock 30 minutes + alert.
  Console reachable from admin networks only (which makes
  this rule almost never fire -- that is the point).

Partner and service accounts:
  Source-allowlisted where possible. Lockout of one of these
  accounts pages the on-call and triggers the partner-lockout
  runbook -- it is a business outage, not just a security event.

Review: compare thresholds to actual log data twice a year.
Document every change and the incident or data that drove it.

Two notes on using these numbers. A lockout threshold is not a password-strength substitute — the policy in password policy for transfer accounts is what makes even unlimited guessing hopeless; throttling just takes away the attempt volume too. And thresholds only protect interfaces they are enabled on: check that FTP, FTPS, SFTP, HTTPS, and the admin console are all covered, because attackers will find the one interface you forgot.

Alerting on the Right Patterns

Raw failure counts make terrible alerts — signature 3 alone would page you nightly with events that need no human. Alert on patterns that are both rare and meaningful:

  • Success after a failure streak. The fire-alarm line from the note above: an account succeeds after ten or more recent failures. Rare, cheap to detect, and exactly what a successful guess looks like.
  • A service or partner account from a new source. These accounts log in from the same addresses for years; a first-ever source is either an undocumented change or a stolen credential in use. Both deserve a human within minutes.
  • Any lockout of a partner or service account. Whatever the cause — stale credential, attack, or typo by an admin doing maintenance — files have stopped moving, and someone should know before the business does.
  • Spray shape. One source failing against five or more distinct accounts in an hour. This is signature 4's fingerprint, invisible to per-account rules by design.
  • Admin console failures — all of them. If the console is properly restricted to admin networks, every failure there is either an admin's typo or a serious problem. Low volume, high signal.

Everything else — the nightly guess-list noise, the banned sources, the typos — belongs in a weekly review summary, not a page. Alert fatigue is how real alerts die: every alert that a human ignores trains the humans to ignore alerts. Getting these patterns out of raw logs and into fired notifications is the pipeline work covered in transfer logging and audit.

The Partner Lockout Runbook

Eventually a partner account locks or a partner calls about failed logins, and the response should be a procedure, not improvisation:

  1. Read the signature before touching anything. Pull the account's recent failures and classify: familiar source at metronome tempo is a stale credential; unfamiliar sources mean the account is under attack and the lockout is doing its job.
  2. Contact the partner out of band — the named contact from your inventory, by phone or a known-good address. Never treat an inbound "please unlock us and remind me of the password" email as authentication; unlock requests are a social-engineering classic.
  3. Stale credential: the partner updates their job with the current credential (or you re-run the rotation properly, with the overlap window from the partner credential lifecycle). The lock expires on its own; the fix is on their side.
  4. Attack signature: leave the lock, tighten the account's source allowlist if it has none, and treat the credential as suspect — which may mean the emergency revocation drill rather than an unlock.
  5. Record it. Date, signature, cause, fix, and anything that slowed you down — three entries of this log will tell you more about your thresholds than any vendor guidance.

The Short Version, and Where to Go Next

Failed logins are a language: typos are human-paced and end in success; stale credentials fail on a metronome from expected sources; brute force arrives machine-fast from strangers against guess-list names; sprays touch many valid accounts gently from one place. Read by source and pattern, not line by line. Then design enforcement to match: hard on sources, soft and self-expiring on accounts, allowlists on the accounts that matter, and alerts reserved for the patterns that are rare and real — above all, the success that follows a streak of failures.

From here: the partner credential lifecycle prevents the stale-credential signature at its source and covers the revocation drill this runbook borrows; service account hygiene sets up the per-job accounts and known sources that make these signatures readable at all; and the brute force protection series builds the automated banning layer that handles signatures 3 and 4 while you sleep.

Frequently Asked Questions

How many failed attempts should trigger a lockout?
Start around ten failures in fifteen minutes for ordinary accounts with an automatic unlock after fifteen minutes, and five in fifteen for admin interfaces. The per-source rules matter more: ten failures in five minutes from one address should block that address. Tune against your own logs after a month.
Should lockouts be permanent until an admin unlocks them?
No. Permanent lockouts convert every attack, stale credential, and clumsy morning into an outage requiring human intervention, and they let an attacker deliberately lock out accounts they cannot crack. Use short auto-expiring locks paired with notifications, and reserve manual-unlock-only for confirmed incident response.
Why do I see login attempts for accounts that don't exist?
Automated scanners try the same guess list everywhere: admin, root, test, ftp, backup, and common first names. Attempts against nonexistent users are the signature of untargeted internet noise. They are worth throttling at the source and worth nothing to investigate — unless the names being tried are your real naming convention, which suggests someone has studied you.
Can attackers use my lockout policy against me?
Yes — that is the main design constraint. Anyone who knows an account name can fail logins on purpose and trip a per-account lockout, turning your defense into their denial-of-service tool. Blunt this by counting per source, keeping account locks short and self-expiring, and putting partner accounts behind source allowlists so strangers cannot generate failures against them at all.
What is the difference between brute force and password spraying?
Brute force is many passwords against one account, fast — easy to spot and easy to throttle. Spraying is one or two likely passwords against many accounts, slowly, specifically to stay under per-account thresholds. You catch brute force by counting failures per account; you catch spraying by counting distinct accounts failed against per source.

From the Sysax team: we build secure file transfer software for Windows — Sysax Multi Server, an FTP, FTPS, SFTP, and HTTPS server, and Sysax FTP Automation for scheduled, scripted transfers. Free trials are on the download page.