Initial commit
This commit is contained in:
commit
d8bec448ad
7
.dockerignore
Normal file
7
.dockerignore
Normal file
@ -0,0 +1,7 @@
|
||||
freepydius.py
|
||||
venv
|
||||
def
|
||||
policies
|
||||
requirements.txt
|
||||
*.ipt
|
||||
*.acl
|
4
.flake8
Normal file
4
.flake8
Normal file
@ -0,0 +1,4 @@
|
||||
[flake8]
|
||||
max-line-length = 120
|
||||
extend-ignore = E203, E501, E722
|
||||
extend-exclude = venv
|
262
.gitignore
vendored
Normal file
262
.gitignore
vendored
Normal file
@ -0,0 +1,262 @@
|
||||
*~
|
||||
|
||||
# temporary files which can be created if a process still has a handle open of a deleted file
|
||||
.fuse_hidden*
|
||||
|
||||
# KDE directory preferences
|
||||
.directory
|
||||
|
||||
# Linux trash folder which might appear on any partition or disk
|
||||
.Trash-*
|
||||
|
||||
# .nfs files are created when an open file is removed but is still being accessed
|
||||
.nfs*
|
||||
|
||||
# Windows thumbnail cache files
|
||||
Thumbs.db
|
||||
Thumbs.db:encryptable
|
||||
ehthumbs.db
|
||||
ehthumbs_vista.db
|
||||
|
||||
# Dump file
|
||||
*.stackdump
|
||||
|
||||
# Folder config file
|
||||
[Dd]esktop.ini
|
||||
|
||||
# Recycle Bin used on file shares
|
||||
$RECYCLE.BIN/
|
||||
|
||||
# Windows Installer files
|
||||
*.cab
|
||||
*.msi
|
||||
*.msix
|
||||
*.msm
|
||||
*.msp
|
||||
|
||||
# Windows shortcuts
|
||||
*.lnk
|
||||
|
||||
# General
|
||||
.DS_Store
|
||||
.AppleDouble
|
||||
.LSOverride
|
||||
|
||||
# Icon must end with two \r
|
||||
Icon
|
||||
|
||||
# Thumbnails
|
||||
._*
|
||||
|
||||
# Files that might appear in the root of a volume
|
||||
.DocumentRevisions-V100
|
||||
.fseventsd
|
||||
.Spotlight-V100
|
||||
.TemporaryItems
|
||||
.Trashes
|
||||
.VolumeIcon.icns
|
||||
.com.apple.timemachine.donotpresent
|
||||
|
||||
# Directories potentially created on remote AFP share
|
||||
.AppleDB
|
||||
.AppleDesktop
|
||||
Network Trash Folder
|
||||
Temporary Items
|
||||
.apdisk
|
||||
|
||||
# Cache files for Sublime Text
|
||||
*.tmlanguage.cache
|
||||
*.tmPreferences.cache
|
||||
*.stTheme.cache
|
||||
|
||||
# Workspace files are user-specific
|
||||
*.sublime-workspace
|
||||
|
||||
# Project files should be checked into the repository, unless a significant
|
||||
# proportion of contributors will probably not be using Sublime Text
|
||||
# *.sublime-project
|
||||
|
||||
# SFTP configuration file
|
||||
sftp-config.json
|
||||
sftp-config-alt*.json
|
||||
|
||||
# Package control specific files
|
||||
Package Control.last-run
|
||||
Package Control.ca-list
|
||||
Package Control.ca-bundle
|
||||
Package Control.system-ca-bundle
|
||||
Package Control.cache/
|
||||
Package Control.ca-certs/
|
||||
Package Control.merged-ca-bundle
|
||||
Package Control.user-ca-bundle
|
||||
oscrypto-ca-bundle.crt
|
||||
bh_unicode_properties.cache
|
||||
|
||||
# Sublime-github package stores a github token in this file
|
||||
# https://packagecontrol.io/packages/sublime-github
|
||||
GitHub.sublime-settings
|
||||
|
||||
# Byte-compiled / optimized / DLL files
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
*$py.class
|
||||
|
||||
# C extensions
|
||||
*.so
|
||||
|
||||
# Distribution / packaging
|
||||
.Python
|
||||
build/
|
||||
develop-eggs/
|
||||
dist/
|
||||
downloads/
|
||||
eggs/
|
||||
.eggs/
|
||||
lib/
|
||||
lib64/
|
||||
parts/
|
||||
sdist/
|
||||
var/
|
||||
wheels/
|
||||
share/python-wheels/
|
||||
*.egg-info/
|
||||
.installed.cfg
|
||||
*.egg
|
||||
MANIFEST
|
||||
|
||||
# PyInstaller
|
||||
# Usually these files are written by a python script from a template
|
||||
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
||||
*.manifest
|
||||
*.spec
|
||||
|
||||
# Installer logs
|
||||
pip-log.txt
|
||||
pip-delete-this-directory.txt
|
||||
|
||||
# Unit test / coverage reports
|
||||
htmlcov/
|
||||
.tox/
|
||||
.nox/
|
||||
.coverage
|
||||
.coverage.*
|
||||
.cache
|
||||
nosetests.xml
|
||||
coverage.xml
|
||||
*.cover
|
||||
*.py,cover
|
||||
.hypothesis/
|
||||
.pytest_cache/
|
||||
cover/
|
||||
|
||||
# Translations
|
||||
*.mo
|
||||
*.pot
|
||||
|
||||
# Django stuff:
|
||||
*.log
|
||||
local_settings.py
|
||||
db.sqlite3
|
||||
db.sqlite3-journal
|
||||
|
||||
# Flask stuff:
|
||||
instance/
|
||||
.webassets-cache
|
||||
|
||||
# Scrapy stuff:
|
||||
.scrapy
|
||||
|
||||
# Sphinx documentation
|
||||
docs/_build/
|
||||
|
||||
# PyBuilder
|
||||
.pybuilder/
|
||||
target/
|
||||
|
||||
# Jupyter Notebook
|
||||
.ipynb_checkpoints
|
||||
|
||||
# IPython
|
||||
profile_default/
|
||||
ipython_config.py
|
||||
|
||||
# pyenv
|
||||
# For a library or package, you might want to ignore these files since the code is
|
||||
# intended to run in multiple environments; otherwise, check them in:
|
||||
# .python-version
|
||||
|
||||
# pipenv
|
||||
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
||||
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
||||
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
||||
# install all needed dependencies.
|
||||
#Pipfile.lock
|
||||
|
||||
# poetry
|
||||
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
||||
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
||||
# commonly ignored for libraries.
|
||||
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
||||
#poetry.lock
|
||||
|
||||
# pdm
|
||||
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
||||
#pdm.lock
|
||||
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
|
||||
# in version control.
|
||||
# https://pdm.fming.dev/#use-with-ide
|
||||
.pdm.toml
|
||||
|
||||
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
||||
__pypackages__/
|
||||
|
||||
# Celery stuff
|
||||
celerybeat-schedule
|
||||
celerybeat.pid
|
||||
|
||||
# SageMath parsed files
|
||||
*.sage.py
|
||||
|
||||
# Environments
|
||||
.env
|
||||
.venv
|
||||
env/
|
||||
venv/
|
||||
ENV/
|
||||
env.bak/
|
||||
venv.bak/
|
||||
|
||||
# Spyder project settings
|
||||
.spyderproject
|
||||
.spyproject
|
||||
|
||||
# Rope project settings
|
||||
.ropeproject
|
||||
|
||||
# mkdocs documentation
|
||||
/site
|
||||
|
||||
# mypy
|
||||
.mypy_cache/
|
||||
.dmypy.json
|
||||
dmypy.json
|
||||
|
||||
# Pyre type checker
|
||||
.pyre/
|
||||
|
||||
# pytype static type analyzer
|
||||
.pytype/
|
||||
|
||||
# Cython debug symbols
|
||||
cython_debug/
|
||||
|
||||
# PyCharm
|
||||
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
||||
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
||||
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
||||
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
||||
.idea/
|
||||
|
||||
# acl files
|
||||
*.acl
|
||||
*.ipt
|
36
Dockerfile
Normal file
36
Dockerfile
Normal file
@ -0,0 +1,36 @@
|
||||
FROM ghcr.io/linuxserver/baseimage-alpine:3.15
|
||||
|
||||
# set version label
|
||||
ARG BUILD_DATE
|
||||
ARG VERSION
|
||||
ARG FREERADIUS_VERSION
|
||||
LABEL build_version="Linuxserver.io version:- ${VERSION} Build-date:- ${BUILD_DATE}"
|
||||
LABEL maintainer="lordwelch"
|
||||
|
||||
# install packages
|
||||
RUN \
|
||||
apk add --no-cache --upgrade \
|
||||
freeradius-python3 py3-paho-mqtt py3-netaddr && \
|
||||
sed -i -e 's@/etc@/config@g' -e '/\suser =\|\sgroup =/s/^/#/g' -e 's@/var/log@/config/log/freeradius@g'\
|
||||
/etc/raddb/radiusd.conf
|
||||
|
||||
|
||||
##DO STUFF HERE
|
||||
## END EACH LINE WITH && \
|
||||
## EXCEPT THE LAST LINE OF THE BLOCK
|
||||
|
||||
|
||||
# add local files
|
||||
COPY root/ /
|
||||
|
||||
# ports and volumes
|
||||
EXPOSE 1812/udp 1813/udp
|
||||
VOLUME /config
|
||||
|
||||
## NOTES ##
|
||||
## Delete files\folders not needed
|
||||
## The User abc, should be running everything, give that permission in any case you need it.
|
||||
## When creating init's Use 10's where posible, its to allow add stuff in between when needed. also, do not be afraid to split custom code into several little ones.
|
||||
## user abc and folders /app /config /defaults are all created by baseimage
|
||||
## the first available init script is 30<your script>
|
||||
## you can comment the beginning of each new RUN block but you cannot comment between commands in each RUN block.
|
205
def/NETWORK.net
Normal file
205
def/NETWORK.net
Normal file
@ -0,0 +1,205 @@
|
||||
#
|
||||
# Sample naming defintions for network objects
|
||||
#
|
||||
RFC1918 = 10.0.0.0/8 # non-public
|
||||
172.16.0.0/12 # non-public
|
||||
192.168.0.0/16 # non-public
|
||||
|
||||
INTERNAL = RFC1918
|
||||
|
||||
LOOPBACK = 127.0.0.0/8 # loopback
|
||||
::1/128 # ipv6 loopback
|
||||
|
||||
RFC_3330 = 169.254.0.0/16 # special use IPv4 addresses - netdeploy
|
||||
|
||||
RFC_6598 = 100.64.0.0/10 # Shared Address Space
|
||||
|
||||
LINKLOCAL = FE80::/10 # IPv6 link-local
|
||||
|
||||
SITELOCAL = FEC0::/10 # Ipv6 Site-local
|
||||
|
||||
MULTICAST = 224.0.0.0/4 # IP multicast
|
||||
FF00::/8 # IPv6 multicast
|
||||
|
||||
CLASS-E = 240.0.0.0/4
|
||||
|
||||
RESERVED = 0.0.0.0/8 # reserved
|
||||
RFC1918
|
||||
LOOPBACK
|
||||
RFC_3330
|
||||
RFC_6598
|
||||
MULTICAST
|
||||
CLASS-E
|
||||
0000::/8 # reserved by IETF
|
||||
0100::/8 # reserved by IETF
|
||||
0200::/7 # reserved by IETF
|
||||
0400::/6 # reserved by IETF
|
||||
0800::/5 # reserved by IETF
|
||||
1000::/4 # reserved by IETF
|
||||
4000::/3 # reserved by IETF
|
||||
6000::/3 # reserved by IETF
|
||||
8000::/3 # reserved by IETF
|
||||
A000::/3 # reserved by IETF
|
||||
C000::/3 # reserved by IETF
|
||||
E000::/4 # reserved by IETF
|
||||
F000::/5 # reserved by IETF
|
||||
F800::/6 # reserved by IETF
|
||||
FC00::/7 # unique local unicast
|
||||
FE00::/9 # reserved by IETF
|
||||
LINKLOCAL # link local unicast
|
||||
SITELOCAL # IPv6 site-local
|
||||
|
||||
PUBLIC = 1.0.0.0/8
|
||||
2.0.0.0/7
|
||||
4.0.0.0/6
|
||||
8.0.0.0/7
|
||||
11.0.0.0/8
|
||||
12.0.0.0/6
|
||||
16.0.0.0/4
|
||||
32.0.0.0/3
|
||||
64.0.0.0/3
|
||||
96.0.0.0/6
|
||||
100.0.0.0/10
|
||||
100.128.0.0/9
|
||||
101.0.0.0/8
|
||||
102.0.0.0/7
|
||||
104.0.0.0/5
|
||||
112.0.0.0/5
|
||||
120.0.0.0/6
|
||||
124.0.0.0/7
|
||||
126.0.0.0/8
|
||||
128.0.0.0/3
|
||||
160.0.0.0/5
|
||||
168.0.0.0/8
|
||||
169.0.0.0/9
|
||||
169.128.0.0/10
|
||||
169.192.0.0/11
|
||||
169.224.0.0/12
|
||||
169.240.0.0/13
|
||||
169.248.0.0/14
|
||||
169.252.0.0/15
|
||||
169.255.0.0/16
|
||||
170.0.0.0/7
|
||||
172.0.0.0/12
|
||||
172.32.0.0/11
|
||||
172.64.0.0/10
|
||||
172.128.0.0/9
|
||||
173.0.0.0/8
|
||||
174.0.0.0/7
|
||||
176.0.0.0/4
|
||||
192.0.1.0/24
|
||||
192.0.3.0/24
|
||||
192.0.4.0/22
|
||||
192.0.8.0/21
|
||||
192.0.16.0/20
|
||||
192.0.32.0/19
|
||||
192.0.64.0/18
|
||||
192.0.128.0/17
|
||||
192.1.0.0/16
|
||||
192.2.0.0/15
|
||||
192.4.0.0/14
|
||||
192.8.0.0/13
|
||||
192.16.0.0/12
|
||||
192.32.0.0/11
|
||||
192.64.0.0/10
|
||||
192.128.0.0/11
|
||||
192.160.0.0/13
|
||||
192.169.0.0/16
|
||||
192.170.0.0/15
|
||||
192.172.0.0/14
|
||||
192.176.0.0/12
|
||||
192.192.0.0/10
|
||||
193.0.0.0/8
|
||||
194.0.0.0/7
|
||||
196.0.0.0/7
|
||||
198.0.0.0/12
|
||||
198.16.0.0/15
|
||||
198.20.0.0/14
|
||||
198.24.0.0/13
|
||||
198.32.0.0/12
|
||||
198.48.0.0/15
|
||||
198.50.0.0/16
|
||||
198.51.0.0/18
|
||||
198.51.64.0/19
|
||||
198.51.96.0/22
|
||||
198.51.101.0/24
|
||||
198.51.102.0/23
|
||||
198.51.104.0/21
|
||||
198.51.112.0/20
|
||||
198.51.128.0/17
|
||||
198.52.0.0/14
|
||||
198.56.0.0/13
|
||||
198.64.0.0/10
|
||||
198.128.0.0/9
|
||||
199.0.0.0/8
|
||||
200.0.0.0/7
|
||||
202.0.0.0/8
|
||||
203.0.0.0/18
|
||||
203.0.64.0/19
|
||||
203.0.96.0/20
|
||||
203.0.112.0/24
|
||||
203.0.114.0/23
|
||||
203.0.116.0/22
|
||||
203.0.120.0/21
|
||||
203.0.128.0/17
|
||||
203.1.0.0/16
|
||||
203.2.0.0/15
|
||||
203.4.0.0/14
|
||||
203.8.0.0/13
|
||||
203.16.0.0/12
|
||||
203.32.0.0/11
|
||||
203.64.0.0/10
|
||||
203.128.0.0/9
|
||||
204.0.0.0/6
|
||||
208.0.0.0/4
|
||||
|
||||
ANY = 0.0.0.0/0
|
||||
|
||||
ANY_V6 = ::/0
|
||||
|
||||
ANY_MIXED = ANY
|
||||
ANY_V6
|
||||
|
||||
# http://www.team-cymru.org/Services/Bogons/bogon-bn-agg.txt
|
||||
# 22-Apr-2011
|
||||
BOGON = 0.0.0.0/8
|
||||
192.0.0.0/24
|
||||
192.0.2.0/24
|
||||
198.18.0.0/15
|
||||
198.51.100.0/24
|
||||
203.0.113.0/24
|
||||
MULTICAST
|
||||
CLASS-E
|
||||
3FFE::/16 # 6bone
|
||||
5F00::/8 # 6bone
|
||||
2001:DB8::/32 # IPv6 documentation prefix
|
||||
|
||||
GOOGLE_PUBLIC_DNS_ANYCAST = 8.8.4.4/32 # IPv4 Anycast
|
||||
8.8.8.8/32 # IPv4 Anycast
|
||||
2001:4860:4860::8844/128 # IPv6 Anycast
|
||||
2001:4860:4860::8888/128 # IPv6 Anycast
|
||||
GOOGLE_DNS = GOOGLE_PUBLIC_DNS_ANYCAST
|
||||
|
||||
|
||||
# The following are sample entires intended for us in the included
|
||||
# sample policy file. These should be removed.
|
||||
|
||||
MANAGEMENT_SERVERS = 192.168.0.1/32
|
||||
192.168.0.44/32
|
||||
192.168.0.46/32
|
||||
|
||||
MAIL_SERVERS = 200.1.1.4/32 # Example mail server 1
|
||||
200.1.1.5/32 # Example mail server 2
|
||||
|
||||
PUBLIC_NAT = 200.1.1.3/32 # Example company NAT address
|
||||
|
||||
NTP_SERVERS = 10.0.0.1/32 # Example NTP server
|
||||
10.0.0.2/32 # Example NTP server
|
||||
|
||||
TACACS_SERVERS = 10.1.0.1/32 # Example tacacs server
|
||||
10.1.0.2/32 # Example tacacs server
|
||||
|
||||
PUBLIC_IPV6_SERVERS = 2606:700:e:550:b01a::b00a # Example public web server
|
||||
|
||||
WEB_IPV6_SERVERS = 2620:15c:2c4:202:b0e7:158f:6a7a:3188/128 # Example web server
|
||||
|
64
def/SERVICES.svc
Normal file
64
def/SERVICES.svc
Normal file
@ -0,0 +1,64 @@
|
||||
#
|
||||
# Sample naming service definitions
|
||||
#
|
||||
WHOIS = 43/udp
|
||||
SSH = 22/tcp
|
||||
TELNET = 23/tcp
|
||||
SMTP = 25/tcp
|
||||
MAIL_SERVICES = SMTP
|
||||
ESMTP
|
||||
SMTP_SSL
|
||||
POP_SSL
|
||||
TIME = 37/tcp 37/udp
|
||||
TACACS = 49/tcp
|
||||
DNS = 53/tcp 53/udp
|
||||
BOOTPS = 67/udp # BOOTP server
|
||||
BOOTPC = 68/udp # BOOTP client
|
||||
DHCP = BOOTPS
|
||||
BOOTPC
|
||||
TFTP = 69/tcp 69/udp
|
||||
HTTP = 80/tcp
|
||||
WEB_SERVICES = HTTP HTTPS
|
||||
POP3 = 110/tcp
|
||||
RPC = 111/udp
|
||||
IDENT = 113/tcp 113/udp
|
||||
NNTP = 119/tcp
|
||||
NTP = 123/tcp 123/udp
|
||||
MS_RPC_EPMAP = 135/udp 135/tcp
|
||||
MS_137 = 137/udp
|
||||
MS_138 = 138/udp
|
||||
MS_139 = 139/tcp
|
||||
IMAP = 143/tcp
|
||||
SNMP = 161/udp
|
||||
SNMP_TRAP = 162/udp
|
||||
BGP = 179/tcp
|
||||
IMAP3 = 220/tcp
|
||||
LDAP = 389/tcp
|
||||
LDAP_SERVICE = LDAP
|
||||
LDAPS
|
||||
HTTPS = 443/tcp
|
||||
MS_445 = 445/tcp
|
||||
SMTP_SSL = 465/tcp
|
||||
IKE = 500/udp
|
||||
SYSLOG = 514/udp
|
||||
RTSP = 554/tcp
|
||||
ESMTP = 587/tcp
|
||||
LDAPS = 636/tcp
|
||||
IMAPS = 993/tcp
|
||||
POP_SSL = 995/tcp
|
||||
HIGH_PORTS = 1024-65535/tcp 1024-65535/udp
|
||||
MSSQL = 1433/tcp
|
||||
MSSQL_MONITOR = 1434/tcp
|
||||
RADIUS = 1812/tcp 1812/udp
|
||||
HSRP = 1985/udp
|
||||
NFSD = 2049/tcp 2049/udp
|
||||
NETFLOW = 2056/udp
|
||||
SQUID_PROXY = 3128/tcp
|
||||
MYSQL = 3306/tcp
|
||||
RDP = 3389/tcp
|
||||
IPSEC = 4500/udp
|
||||
POSTGRESQL = 5432/tcp
|
||||
TRACEROUTE = 33434-33534/udp
|
||||
|
||||
|
||||
MGMT = SSH 23/tcp 441/tcp 442/tcp
|
125
freepydius.py
Normal file
125
freepydius.py
Normal file
@ -0,0 +1,125 @@
|
||||
import json
|
||||
import os
|
||||
import os.path
|
||||
from collections import defaultdict
|
||||
|
||||
import netaddr
|
||||
import paho.mqtt.client as mqtt
|
||||
import radiusd
|
||||
|
||||
|
||||
def log(level, s):
|
||||
"""Log function."""
|
||||
radiusd.radlog(level, __name__ + ": " + s)
|
||||
|
||||
|
||||
# The callback for when the client receives a CONNACK response from the server.
|
||||
def on_connect(client, userdata, flags, rc):
|
||||
print("Connected with result code " + str(rc))
|
||||
|
||||
# Subscribing in on_connect() means that if we lose the connection and
|
||||
# reconnect then subscriptions will be renewed.
|
||||
client.subscribe("router7/#")
|
||||
|
||||
|
||||
def get_leases():
|
||||
msgs = defaultdict(lambda: defaultdict(str))
|
||||
|
||||
# The callback for when a PUBLISH message is received from the server.
|
||||
def on_message(client, userdata, msg):
|
||||
lease = json.loads(msg.payload)
|
||||
lease["identifier"] = os.path.basename(msg.topic)
|
||||
msgs[lease["identifier"]] = defaultdict(str, lease)
|
||||
|
||||
client = mqtt.Client()
|
||||
client.username_pw_set(os.getenv("MQTT_USERNAME"), os.getenv("MQTT_PASSWORD"))
|
||||
client.on_connect = on_connect
|
||||
client.on_message = on_message
|
||||
|
||||
client.connect("hassio.narnian.us", 1883, 60)
|
||||
|
||||
cont = True
|
||||
count = 0
|
||||
while cont:
|
||||
client.loop(timeout=0.5)
|
||||
client.loop(timeout=0.5)
|
||||
client.loop(timeout=0.5)
|
||||
client.loop(timeout=0.5)
|
||||
if count == len(msgs):
|
||||
break
|
||||
count = len(msgs)
|
||||
return msgs
|
||||
|
||||
|
||||
def select_acls(lease):
|
||||
acls = []
|
||||
if lease["vendor_identifier"].contains("PS4"):
|
||||
acls.append("DENY")
|
||||
acls.append("WEB")
|
||||
|
||||
return acls
|
||||
|
||||
|
||||
def ciscoize_acl_names(acls):
|
||||
cisco = []
|
||||
for acl in acls:
|
||||
cisco.append(
|
||||
tuple(
|
||||
"Cisco-AVPair",
|
||||
"+=",
|
||||
f"ACS:CiscoSecure-Defined-ACL=#ACSACL#-${acl}-fuckcisc",
|
||||
)
|
||||
)
|
||||
return cisco
|
||||
|
||||
|
||||
def deciscoize_acl_name(acl_name):
|
||||
return acl_name.split("#ACSACL#-")[1][0:-9]
|
||||
|
||||
|
||||
def get_acl(acl_name):
|
||||
with open(acl_name, encoding="utf-8") as f:
|
||||
return f.read()
|
||||
|
||||
|
||||
def authorize(p):
|
||||
os.chdir(os.path.dirname(__file__))
|
||||
log(radiusd.L_INFO, str(p))
|
||||
print("*** authorize ***")
|
||||
print("")
|
||||
radiusd.radlog(radiusd.L_INFO, "*** radlog call in authorize ***")
|
||||
print("")
|
||||
print(p)
|
||||
print("")
|
||||
print(radiusd.config)
|
||||
print("")
|
||||
request = defaultdict(str, p["request"])
|
||||
reply = [
|
||||
("User-Name", request["User-Name"]),
|
||||
]
|
||||
|
||||
if netaddr.valid_mac(request["User-Name"]):
|
||||
leases = get_leases()
|
||||
|
||||
reply.extend(ciscoize_acl_names(select_acls(leases[request["User-Name"]])))
|
||||
elif "#ACSACL#" in request["User-Name"]:
|
||||
deciscoize_acl_name(request["User-Name"])
|
||||
|
||||
conf = [
|
||||
("Auth-Type", "Accept"),
|
||||
]
|
||||
|
||||
log(radiusd.L_INFO, str(reply))
|
||||
log(radiusd.L_INFO, str(conf))
|
||||
return (radiusd.RLM_MODULE_OK, tuple(reply), tuple(conf))
|
||||
|
||||
|
||||
def authenticate(p):
|
||||
os.chdir(os.path.dirname(__file__))
|
||||
log(radiusd.L_INFO, str(p))
|
||||
radiusd.radlog(radiusd.L_INFO, "*** radlog call in authenticate ***")
|
||||
print("")
|
||||
print(p)
|
||||
print("")
|
||||
print(radiusd.config)
|
||||
return radiusd.RLM_MODULE_OK
|
114
policies/pol/sample_multitarget.pol
Normal file
114
policies/pol/sample_multitarget.pol
Normal file
@ -0,0 +1,114 @@
|
||||
#
|
||||
# This is an example policy for capirca
|
||||
#
|
||||
header {
|
||||
comment:: "this is a sample edge input filter that generates"
|
||||
comment:: "multiple output formats."
|
||||
# NOTES: iptables produces filter 'lines' that must be used as args to the
|
||||
# '$ iptables' cmd, while Speedway produces stateful iptables filters
|
||||
# compatible with iptables-restore (most people will prefer speedway)
|
||||
target:: cisco default-web extended
|
||||
target:: speedway INPUT
|
||||
}
|
||||
|
||||
# #include 'includes/untrusted-networks-blocking.inc'
|
||||
|
||||
|
||||
term permit-web-services {
|
||||
# destination-address:: WEB_SERVERS
|
||||
protocol:: tcp
|
||||
destination-port:: WEB_SERVICES
|
||||
action:: accept
|
||||
}
|
||||
|
||||
header {
|
||||
target:: cisco windows extended
|
||||
}
|
||||
|
||||
term accept-dhcp {
|
||||
comment:: "Optional - allow DHCP requests."
|
||||
destination-port:: DHCP
|
||||
protocol:: udp
|
||||
action:: accept
|
||||
}
|
||||
|
||||
term accept-dns {
|
||||
destination-port:: DNS
|
||||
protocol:: tcp udp
|
||||
action:: accept
|
||||
}
|
||||
|
||||
term accept-icmp {
|
||||
protocol:: icmp
|
||||
action:: accept
|
||||
}
|
||||
|
||||
term default-deny {
|
||||
action:: deny
|
||||
}
|
||||
|
||||
header {
|
||||
|
||||
target:: cisco accept-internal-ssh extended
|
||||
}
|
||||
|
||||
term accept-public-ssh {
|
||||
destination-address:: PUBLIC
|
||||
protocol:: tcp
|
||||
destination-port:: SSH
|
||||
action:: accept
|
||||
}
|
||||
|
||||
header {
|
||||
|
||||
target:: cisco accept-internal-ssh extended
|
||||
}
|
||||
|
||||
term allow-internal-ssh {
|
||||
destination-address:: INTERNAL
|
||||
protocol:: tcp
|
||||
destination-port:: SSH
|
||||
action:: accept
|
||||
}
|
||||
|
||||
header {
|
||||
|
||||
target:: cisco accept-mgmt-ssh extended
|
||||
}
|
||||
|
||||
term allow-mgmt-ssh {
|
||||
destination-address:: MANAGEMENT_SERVERS
|
||||
protocol:: tcp
|
||||
destination-port:: MGMT
|
||||
action:: accept
|
||||
}
|
||||
|
||||
# term permit-tcp-established {
|
||||
# destination-address:: MAIL_SERVERS WEB_SERVERS PUBLIC_NAT
|
||||
# protocol:: tcp
|
||||
# option:: tcp-established
|
||||
# action:: accept
|
||||
# }
|
||||
|
||||
# term permit-udp-established {
|
||||
# destination-address:: MAIL_SERVERS WEB_SERVERS PUBLIC_NAT
|
||||
# protocol:: udp
|
||||
# source-port:: HIGH_PORTS
|
||||
# action:: accept
|
||||
# }
|
||||
|
||||
|
||||
# header {
|
||||
# comment:: "this is a sample output filter"
|
||||
# target:: cisco edge-outbound extended
|
||||
# target:: speedway OUTPUT
|
||||
# }
|
||||
|
||||
# term deny-to-bad-destinations {
|
||||
# destination-address:: RFC1918 BOGON RESERVED
|
||||
# action:: deny
|
||||
# }
|
||||
|
||||
# term default-accept {
|
||||
# action:: accept
|
||||
# }
|
12
pyproject.toml
Normal file
12
pyproject.toml
Normal file
@ -0,0 +1,12 @@
|
||||
[tool.black]
|
||||
line-length = 120
|
||||
|
||||
[tool.isort]
|
||||
line_length = 120
|
||||
profile = "black"
|
||||
|
||||
[tool.pylint.messages_control]
|
||||
disable = "C0330, C0326, C0115, C0116, C0103"
|
||||
|
||||
[tool.pylint.format]
|
||||
max-line-length=120
|
6
requirements.txt
Normal file
6
requirements.txt
Normal file
@ -0,0 +1,6 @@
|
||||
isort>=5.10
|
||||
black>=22
|
||||
flake8==4.*
|
||||
flake8-encodings
|
||||
netaddr==0.8.*
|
||||
paho-mqtt==1.6.*
|
7
root/etc/cont-init.d/11-folders
Normal file
7
root/etc/cont-init.d/11-folders
Normal file
@ -0,0 +1,7 @@
|
||||
#!/usr/bin/with-contenv bash
|
||||
|
||||
# make folders
|
||||
mkdir -p \
|
||||
/config/log/freeradius \
|
||||
/config/raddb/
|
||||
chown -R abc:abc /config/log
|
42
root/etc/cont-init.d/12-freeradius
Normal file
42
root/etc/cont-init.d/12-freeradius
Normal file
@ -0,0 +1,42 @@
|
||||
#!/usr/bin/with-contenv bash
|
||||
|
||||
migrate(){
|
||||
local OLD_LOCATION="${1}"
|
||||
local NEW_LOCATION="${2}"
|
||||
|
||||
if [[ -e ${OLD_LOCATION} ]];then
|
||||
if [[ ! -e ${NEW_LOCATION} ]];then
|
||||
echo "moving to ${NEW_LOCATION}"
|
||||
cp -drT "${OLD_LOCATION}" "${NEW_LOCATION}"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
migrate_dir(){
|
||||
local OLD_LOCATION="${1}"
|
||||
local NEW_LOCATION="${2}"
|
||||
mkdir -p "${NEW_LOCATION}"
|
||||
|
||||
for f in "${OLD_LOCATION}/"*; do
|
||||
migrate "${f}" "${NEW_LOCATION}/${f#$OLD_LOCATION/}"
|
||||
done
|
||||
}
|
||||
|
||||
migrate /etc/raddb/README.rst /config/raddb/README.rst
|
||||
migrate /etc/raddb/clients.conf /config/raddb/clients.conf
|
||||
migrate /etc/raddb/dictionary /config/raddb/dictionary
|
||||
migrate /etc/raddb/panic.gdb /config/raddb/panic.gdb
|
||||
migrate /etc/raddb/proxy.conf /config/raddb/proxy.conf
|
||||
migrate /etc/raddb/radiusd.conf /config/raddb/radiusd.conf
|
||||
migrate /etc/raddb/templates.conf /config/raddb/templates.conf
|
||||
migrate /etc/raddb/trigger.conf /config/raddb/trigger.conf
|
||||
|
||||
migrate /etc/raddb/mods-enabled /config/raddb/mods-enabled
|
||||
migrate /etc/raddb/sites-enabled /config/raddb/sites-enabled
|
||||
|
||||
migrate_dir /etc/raddb/certs /config/raddb/certs
|
||||
migrate_dir /etc/raddb/policy.d /config/raddb/policy.d
|
||||
migrate_dir /etc/raddb/mods-available /config/raddb/mods-available
|
||||
migrate_dir /etc/raddb/mods-config /config/raddb/mods-config
|
||||
migrate_dir /etc/raddb/sites-available /config/raddb/sites-available
|
||||
|
||||
chown -R abc:abc /config
|
5
root/etc/services.d/freeradius3/finish
Executable file
5
root/etc/services.d/freeradius3/finish
Executable file
@ -0,0 +1,5 @@
|
||||
#!/usr/bin/execlineb -S1
|
||||
if { s6-test ${1} -ne 0 }
|
||||
if { s6-test ${1} -ne 256 }
|
||||
|
||||
s6-svscanctl -t /var/run/s6/services
|
10
root/etc/services.d/freeradius3/run
Executable file
10
root/etc/services.d/freeradius3/run
Executable file
@ -0,0 +1,10 @@
|
||||
#!/usr/bin/with-contenv bash
|
||||
|
||||
# parse env vars to options
|
||||
OPTIONS=""
|
||||
if [[ ${FREERADIUS_DEBUG} && ${FREERADIUS_DEBUG-x} ]]; then
|
||||
OPTIONS+="-X "
|
||||
fi
|
||||
|
||||
exec \
|
||||
s6-setuidgid abc /usr/sbin/radiusd -l stdout -f -d /config/raddb ${OPTIONS}
|
Loading…
x
Reference in New Issue
Block a user