2019-01-29 14:09:33 +03:00
|
|
|
|
# 🔮 Nextcloud Suspicious Login Detection
|
|
|
|
|
|
2018-11-27 13:54:59 +03:00
|
|
|
|
Detect and warn about suspicious IPs logging into Nextcloud
|
2019-01-29 14:09:33 +03:00
|
|
|
|
|
|
|
|
|
The app is in incubation stage, so it’s time for you to [get involved! 👩💻](https://github.com/nextcloud/suspicious_login#development-setup)
|
|
|
|
|
|
|
|
|
|
## How it works
|
|
|
|
|
|
|
|
|
|
### Data collection
|
|
|
|
|
|
|
|
|
|
Once this app is enabled, it will automatically start tracking (IP, uid) tuples from
|
|
|
|
|
successful logins on the instance and feed them into the `login_address` table. This
|
|
|
|
|
insert operation is executed for the majority of requests (client authenticate on
|
|
|
|
|
almost all requests) and therefore has to be fast. In a background job, these rows
|
|
|
|
|
will be transformed into an aggregated format that is suitable for the training of
|
|
|
|
|
the neural net. The (IP, uid) tuple becomes (IP, uid, first_seen, last_seen, seen) so
|
|
|
|
|
that we know which (IP, uid) tuple has been seen first and last. The aggregated data
|
|
|
|
|
is a compressed format of the raw data. The original data gets deleted and thus the
|
|
|
|
|
database does not need much space for the collected login data.
|
|
|
|
|
|
|
|
|
|
### Neural net
|
|
|
|
|
|
2019-02-22 15:32:01 +03:00
|
|
|
|
When enough data is collected – which by default is 60 days (!) – a first
|
|
|
|
|
training run can be started.
|
|
|
|
|
|
|
|
|
|
The app registers a background job that invokes the training once a day.
|
|
|
|
|
As long as there isn't sufficient data, no trained model is generated.
|
|
|
|
|
|
|
|
|
|
#### Manual training
|
|
|
|
|
|
|
|
|
|
The training can also be invoked via the OCC command line tool:
|
2019-01-29 14:09:33 +03:00
|
|
|
|
|
|
|
|
|
```bash
|
2019-02-22 12:25:39 +03:00
|
|
|
|
php -f occ suspiciouslogin:train
|
2019-01-29 14:09:33 +03:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
This command uses several sensible default that should work for instances of any size.
|
|
|
|
|
The ``--stats`` flag is useful to see the measured performance of the trained model
|
|
|
|
|
after the training finishes. The duration of the training run depends on the size
|
|
|
|
|
of the input training set, but is usually between two to 15 minutes.
|
|
|
|
|
|
|
|
|
|
The full list of parameters, their description and default values can be seen with
|
|
|
|
|
|
|
|
|
|
```bash
|
2019-02-22 12:25:39 +03:00
|
|
|
|
php -f occ suspiciouslogin:train --help
|
2019-01-29 14:09:33 +03:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Hyper parameter optimization (optional)
|
|
|
|
|
|
|
|
|
|
To find the best possible parameters for the training it's possible to start a *hyper
|
|
|
|
|
parameter optimization* run via the CLI:
|
|
|
|
|
|
|
|
|
|
```bash
|
2019-02-22 12:25:39 +03:00
|
|
|
|
php -f occ suspiciouslogin:optimize
|
2019-01-29 14:09:33 +03:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
This command uses the heuristic *simulated annealing* algorithm to find optimal
|
|
|
|
|
parameter sets in the multidimensional parameter space. By default this will do **100**
|
|
|
|
|
steps consisting of five training runs per step, hence this command might take a few
|
|
|
|
|
days to execute on large instances. On smaller ones it will also take a few hours.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Login classification
|
|
|
|
|
|
|
|
|
|
As soon as the first model is trained, the app will start classifying (IP, uid) tuples
|
|
|
|
|
on login. In contrast to the data collection it won't consider requests authenticated
|
|
|
|
|
via an app password as suspicious. Should it detect a password login where the (IP,
|
|
|
|
|
uid) is classified as suspicious by the trained model, it will add an entry to the
|
|
|
|
|
``suspicious_login`` table, including the timestamp, request id and URL.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Development setup
|
|
|
|
|
|
|
|
|
|
1. ☁ Clone the app into the `apps` folder of your Nextcloud: `git clone https://github.com/ChristophWurst/recommendations.git`
|
|
|
|
|
2. 💻 Run `npm i` or `krankerl up` to install the dependencies
|
|
|
|
|
3. 🏗 To build the Javascript whenever you make changes, run `npm run dev`
|
|
|
|
|
4. ☁ Enable the app through the app management of your Nextcloud or run `krankerl enable`
|
|
|
|
|
5. 👍 Partytime! Help fix [some issues](https://github.com/nextcloud/suspicious_login/issues) and [review pull requests](https://github.com/nextcloud/suspicious_login/pulls)
|