Initial import
This commit is contained in:
commit
83f0e827c6
10 changed files with 172 additions and 0 deletions
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
*.retry
|
||||||
|
*/__pycache__
|
||||||
|
*.pyc
|
||||||
|
.cache
|
11
.yamllint
Normal file
11
.yamllint
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
---
|
||||||
|
extends: default
|
||||||
|
|
||||||
|
rules:
|
||||||
|
line-length:
|
||||||
|
max: 120
|
||||||
|
level: warning
|
||||||
|
|
||||||
|
ignore: |
|
||||||
|
.github/stale.yml
|
||||||
|
.travis.yml
|
71
README.md
Normal file
71
README.md
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
|
||||||
|
# Ansible Role: Notify SSH Login via Ntfy
|
||||||
|
|
||||||
|
This Ansible role automates the setup for sending notifications whenever a user logs in to your Linux servers via SSH. It intercepts successful SSH connections using PAM and triggers a script to send an HTTP request with details about the login event.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
* Integrates with PAM to capture successful SSH login attempts.
|
||||||
|
* Uses a customizable script to send notifications via an HTTP request.
|
||||||
|
* Supports sending notifications to services like ntfy.sh (configurable).
|
||||||
|
* Includes Molecule test suite using Vagrant for automated testing.
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
* Ansible >= 2.9
|
||||||
|
* Python package `requests` (for Molecule tests)
|
||||||
|
|
||||||
|
## Role Variables
|
||||||
|
|
||||||
|
The role utilizes the following default variables, which can be overridden in your playbook:
|
||||||
|
|
||||||
|
* `docker_install_compose_plugin` (bool): Whether to install the Docker Compose plugin (defaults to `false`).
|
||||||
|
* `docker_compose_package` (str): Package name for Docker Compose (defaults to `docker-compose`).
|
||||||
|
|
||||||
|
**Additional variables are defined within the role's defaults/main.yml file.**
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
1. **Clone or copy the role directory.**
|
||||||
|
2. **Include the role in your playbook:**
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
- name: Notify SSH logins
|
||||||
|
hosts: all
|
||||||
|
become: true
|
||||||
|
roles:
|
||||||
|
- notify_ssh_login
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Customize variables (optional):**
|
||||||
|
|
||||||
|
Override any default variables in your playbook's `vars` section.
|
||||||
|
|
||||||
|
4. **Run the playbook:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ansible-playbook your_playbook.yml
|
||||||
|
```
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
|
||||||
|
The role includes a Molecule test suite that utilizes Vagrant to provision a test environment. To execute the tests:
|
||||||
|
|
||||||
|
1. Ensure Vagrant and VirtualBox are installed.
|
||||||
|
2. Navigate to the role directory.
|
||||||
|
3. Run the following commands:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
molecule init
|
||||||
|
molecule converge
|
||||||
|
molecule verify
|
||||||
|
```
|
||||||
|
|
||||||
|
### Contributing
|
||||||
|
|
||||||
|
We welcome contributions to this role! Please see the contributing guidelines in the `CONTRIBUTING.md` file for details.
|
||||||
|
|
||||||
|
### License
|
||||||
|
|
||||||
|
This role is licensed under the MIT License. See the `LICENSE` file for details.
|
4
defaults/main.yml
Normal file
4
defaults/main.yml
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
---
|
||||||
|
# Variables par défaut pour le rôle de notification de connexion SSH
|
||||||
|
|
||||||
|
ntfy_topic: "votre_sujet_ntfy" # Remplacer par votre sujet ntfy.sh
|
15
files/notify_login.sh
Normal file
15
files/notify_login.sh
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Récupérer les variables d'environnement
|
||||||
|
USER=$PAM_USER
|
||||||
|
HOST=$PAM_RHOST
|
||||||
|
IPADDR=$PAM_RHOSTADDR
|
||||||
|
SESSION=$PAM_TTY
|
||||||
|
|
||||||
|
# Envoyer une notification via ntfy.sh (remplacer "your_topic" par votre sujet ntfy)
|
||||||
|
curl -X POST https://ntfy.sh/your_topic \
|
||||||
|
-d '{
|
||||||
|
"title": "Connexion SSH",
|
||||||
|
"message": "Utilisateur '$USER' connecté depuis '$HOST' ($IPADDR) - Session: '$SESSION'",
|
||||||
|
"priority": 1
|
||||||
|
}'
|
0
meta/main.yml
Normal file
0
meta/main.yml
Normal file
23
molecule/default.yml
Normal file
23
molecule/default.yml
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
---
|
||||||
|
driver: vagrant
|
||||||
|
|
||||||
|
verifier:
|
||||||
|
name: testinfra
|
||||||
|
|
||||||
|
provisioner:
|
||||||
|
name: ansible
|
||||||
|
playbooks:
|
||||||
|
- provision.yml
|
||||||
|
|
||||||
|
platforms:
|
||||||
|
- name: default
|
||||||
|
config:
|
||||||
|
vm:
|
||||||
|
box: bento/ubuntu-18.04
|
||||||
|
network:
|
||||||
|
private_network: true
|
||||||
|
|
||||||
|
lint:
|
||||||
|
name: ansible-lint
|
||||||
|
playbooks:
|
||||||
|
- provision.yml
|
6
molecule/provision.yml
Normal file
6
molecule/provision.yml
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
- name: Provision SSH login notification role
|
||||||
|
hosts: all
|
||||||
|
become: true
|
||||||
|
roles:
|
||||||
|
- notify_ssh_login
|
12
molecule/testinfra/test_login_notifications.py
Normal file
12
molecule/testinfra/test_login_notifications.py
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
import os
|
||||||
|
import testinfra.utils.commands as commands
|
||||||
|
|
||||||
|
def test_login_notification_is_sent():
|
||||||
|
# Vérifier que la notification a été envoyée
|
||||||
|
notification_file = os.path.join('/tmp', 'login_notification.json')
|
||||||
|
assert commands.check_output('test -f {}'.format(notification_file)) == 0
|
||||||
|
|
||||||
|
# Vérifier le contenu du fichier de notification
|
||||||
|
notification_data = json.loads(commands.check_output('cat {}'.format(notification_file)))
|
||||||
|
assert notification_data['title'] == 'Connexion SSH'
|
||||||
|
assert notification_data['message'].startswith('Utilisateur')
|
26
tasks/main.yml
Normal file
26
tasks/main.yml
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
---
|
||||||
|
- name: Notify SSH logins
|
||||||
|
hosts: all
|
||||||
|
become: true
|
||||||
|
tasks:
|
||||||
|
- name: Install curl
|
||||||
|
apt:
|
||||||
|
name: curl
|
||||||
|
state: latest
|
||||||
|
when: not ansible_facts['packages']['curl'] is defined
|
||||||
|
|
||||||
|
- name: Copy PAM module
|
||||||
|
copy:
|
||||||
|
src: files/pam_ssh_auth.conf
|
||||||
|
dest: /etc/pam.d/ssh
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: 0644
|
||||||
|
|
||||||
|
- name: Copy notification script
|
||||||
|
copy:
|
||||||
|
src: tasks/notify_login.sh
|
||||||
|
dest: /usr/local/bin/notify_login.sh
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: 0755
|
Loading…
Reference in a new issue