diff options
| author | Christian Breunig <christian@breunig.cc> | 2023-08-20 14:56:12 +0200 | 
|---|---|---|
| committer | Christian Breunig <christian@breunig.cc> | 2023-08-20 15:02:59 +0200 | 
| commit | 0bfb81750045be9c8c82a8f8f7bb18f6e6136d94 (patch) | |
| tree | ffd0138878c409a3e620dad153170f60e5e9b395 /src | |
| parent | ffb798b4678f3b1bd0a40cc42b1f0477470346dc (diff) | |
| download | vyos-1x-0bfb81750045be9c8c82a8f8f7bb18f6e6136d94.tar.gz vyos-1x-0bfb81750045be9c8c82a8f8f7bb18f6e6136d94.zip | |
wifi: T5491: allow white-/blacklisting station MAC addresses for security
Station MAC address-based authentication means:
* 'allow' accept all clients except the one on the deny list
* 'deny' accept only clients listed on the accept list
New CLI commands:
* set interfaces wireless wlan0 security station-address mode <accept|deny>
* set interfaces wireless wlan0 security station-address accept mac <mac>
* set interfaces wireless wlan0 security station-address deny mac <mac>
Diffstat (limited to 'src')
| -rwxr-xr-x | src/conf_mode/interfaces-wireless.py | 27 | 
1 files changed, 19 insertions, 8 deletions
| diff --git a/src/conf_mode/interfaces-wireless.py b/src/conf_mode/interfaces-wireless.py index 29ab9713f..a1d978ebd 100755 --- a/src/conf_mode/interfaces-wireless.py +++ b/src/conf_mode/interfaces-wireless.py @@ -42,6 +42,8 @@ airbag.enable()  # XXX: wpa_supplicant works on the source interface  wpa_suppl_conf = '/run/wpa_supplicant/{ifname}.conf'  hostapd_conf = '/run/hostapd/{ifname}.conf' +hostapd_accept_station_conf = '/run/hostapd/{ifname}_station_accept.conf' +hostapd_deny_station_conf = '/run/hostapd/{ifname}_station_deny.conf'  def find_other_stations(conf, base, ifname):      """ @@ -81,10 +83,12 @@ def get_config(config=None):      if 'deleted' not in wifi:          # then get_interface_dict provides default keys -        if wifi.from_defaults(['security']): # if not set by user -            del wifi['security'] +        if wifi.from_defaults(['security', 'wep']): # if not set by user +            del wifi['security']['wep'] +        if wifi.from_defaults(['security', 'wpa']): # if not set by user +            del wifi['security']['wpa'] -    if 'security' in wifi and 'wpa' in wifi['security']: +    if dict_search('security.wpa', wifi) != None:          wpa_cipher = wifi['security']['wpa'].get('cipher')          wpa_mode = wifi['security']['wpa'].get('mode')          if not wpa_cipher: @@ -102,6 +106,10 @@ def get_config(config=None):      tmp = find_other_stations(conf, base, wifi['ifname'])      if tmp: wifi['station_interfaces'] = tmp +    # used in hostapt.conf.j2 +    wifi['hostapd_accept_station_conf'] = hostapd_accept_station_conf.format(**wifi) +    wifi['hostapd_deny_station_conf'] = hostapd_deny_station_conf.format(**wifi) +      return wifi  def verify(wifi): @@ -189,7 +197,10 @@ def generate(wifi):      if 'deleted' in wifi:          if os.path.isfile(hostapd_conf.format(**wifi)):              os.unlink(hostapd_conf.format(**wifi)) - +        if os.path.isfile(hostapd_accept_station_conf.format(**wifi)): +            os.unlink(hostapd_accept_station_conf.format(**wifi)) +        if os.path.isfile(hostapd_deny_station_conf.format(**wifi)): +            os.unlink(hostapd_deny_station_conf.format(**wifi))          if os.path.isfile(wpa_suppl_conf.format(**wifi)):              os.unlink(wpa_suppl_conf.format(**wifi)) @@ -224,12 +235,12 @@ def generate(wifi):      # render appropriate new config files depending on access-point or station mode      if wifi['type'] == 'access-point': -        render(hostapd_conf.format(**wifi), 'wifi/hostapd.conf.j2', -               wifi) +        render(hostapd_conf.format(**wifi), 'wifi/hostapd.conf.j2', wifi) +        render(hostapd_accept_station_conf.format(**wifi), 'wifi/hostapd_accept_station.conf.j2', wifi) +        render(hostapd_deny_station_conf.format(**wifi), 'wifi/hostapd_deny_station.conf.j2', wifi)      elif wifi['type'] == 'station': -        render(wpa_suppl_conf.format(**wifi), 'wifi/wpa_supplicant.conf.j2', -               wifi) +        render(wpa_suppl_conf.format(**wifi), 'wifi/wpa_supplicant.conf.j2', wifi)      return None | 
