Adds persistent storage using modernc.org/sqlite (pure Go). Login attempts are deduplicated by (username, password, ip) with counts. Sessions and session logs are tracked with UUID IDs. Includes embedded SQL migrations, configurable retention with background pruning, and an in-memory store for tests. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
74 lines
1.7 KiB
Markdown
74 lines
1.7 KiB
Markdown
# Oubliette
|
|
|
|
An SSH honeypot that logs login attempts, presents fake shells to "successful" logins, and tries to detect when a real human is poking around.
|
|
|
|
Named after the medieval dungeon - a place you throw people into and forget about them.
|
|
|
|
## Status
|
|
|
|
Early development. See `PLAN.md` for the roadmap.
|
|
|
|
## Usage
|
|
|
|
### Build
|
|
|
|
```sh
|
|
# With Nix
|
|
nix build
|
|
|
|
# With Go
|
|
nix develop -c go build ./cmd/oubliette
|
|
```
|
|
|
|
### Configure
|
|
|
|
Copy and edit the example config:
|
|
|
|
```sh
|
|
cp oubliette.toml.example oubliette.toml
|
|
```
|
|
|
|
Key settings:
|
|
- `ssh.listen_addr` — listen address (default `:2222`)
|
|
- `ssh.host_key_path` — Ed25519 host key, auto-generated if missing
|
|
- `auth.accept_after` — accept login after N failures per IP (default `10`)
|
|
- `auth.credential_ttl` — how long to remember accepted credentials (default `24h`)
|
|
- `auth.static_credentials` — always-accepted username/password pairs
|
|
- `storage.db_path` — SQLite database path (default `oubliette.db`)
|
|
- `storage.retention_days` — auto-prune records older than N days (default `90`)
|
|
- `storage.retention_interval` — how often to run retention (default `1h`)
|
|
|
|
### Run
|
|
|
|
```sh
|
|
./oubliette -config oubliette.toml
|
|
```
|
|
|
|
Test with:
|
|
|
|
```sh
|
|
ssh -o StrictHostKeyChecking=no -p 2222 root@localhost
|
|
```
|
|
|
|
### NixOS Module
|
|
|
|
Add the flake as an input and enable the service:
|
|
|
|
```nix
|
|
{
|
|
services.oubliette = {
|
|
enable = true;
|
|
package = inputs.oubliette.packages.${system}.default;
|
|
settings = {
|
|
ssh.listen_addr = ":2222";
|
|
auth.accept_after = 10;
|
|
auth.static_credentials = [
|
|
{ username = "root"; password = "toor"; }
|
|
];
|
|
};
|
|
};
|
|
}
|
|
```
|
|
|
|
Alternatively, use `configFile` to pass a pre-written TOML file instead of `settings`.
|