You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
489 lines
15 KiB
489 lines
15 KiB
From 1c936bb38d39b238001364e1a7ee5479bdfff053 Mon Sep 17 00:00:00 2001 |
|
From: Dominic Cleal <dcleal@redhat.com> |
|
Date: Fri, 12 Jun 2015 11:01:57 +0100 |
|
Subject: [PATCH] Sshd: revert Sshd module to 1.1.0-compatible, add Sshd_140 |
|
|
|
In order to keep the default sshd config lens compatible with 1.1.0, |
|
the lens from 1.4.0 has been kept in the Sshd_140 module and is not |
|
loaded by default. Use aug_transform, augtool --transform etc. to use |
|
it instead of Sshd. |
|
--- |
|
lenses/sshd.aug | 52 ++++++--------- |
|
lenses/sshd_140.aug | 141 +++++++++++++++++++++++++++++++++++++++++ |
|
lenses/tests/test_sshd.aug | 56 ---------------- |
|
lenses/tests/test_sshd_140.aug | 136 +++++++++++++++++++++++++++++++++++++++ |
|
tests/Makefile.am | 1 + |
|
5 files changed, 298 insertions(+), 88 deletions(-) |
|
create mode 100644 lenses/sshd_140.aug |
|
create mode 100644 lenses/tests/test_sshd_140.aug |
|
|
|
diff --git a/lenses/sshd.aug b/lenses/sshd.aug |
|
index 55f6c4f7..785102ec 100644 |
|
--- a/lenses/sshd.aug |
|
+++ b/lenses/sshd.aug |
|
@@ -70,55 +70,41 @@ module Sshd = |
|
|
|
let sep = Util.del_ws_spc |
|
|
|
- let indent = del /[ \t]*/ " " |
|
- |
|
let key_re = /[A-Za-z0-9]+/ |
|
- - /MACs|Match|AcceptEnv|Subsystem|Ciphers|KexAlgorithms|(Allow|Deny)(Groups|Users)/i |
|
+ - /MACs|Match|AcceptEnv|Subsystem|(Allow|Deny)(Groups|Users)/ |
|
|
|
let comment = Util.comment |
|
- let comment_noindent = Util.comment_noindent |
|
let empty = Util.empty |
|
|
|
- let array_entry (kw:regexp) (sq:string) = |
|
+ let array_entry (k:string) = |
|
let value = store /[^ \t\n]+/ in |
|
- [ key kw . [ sep . seq sq . value]* . eol ] |
|
+ [ key k . [ sep . seq k . value]* . eol ] |
|
|
|
let other_entry = |
|
let value = store /[^ \t\n]+([ \t]+[^ \t\n]+)*/ in |
|
[ key key_re . sep . value . eol ] |
|
|
|
- let accept_env = array_entry /AcceptEnv/i "AcceptEnv" |
|
+ let accept_env = array_entry "AcceptEnv" |
|
|
|
- let allow_groups = array_entry /AllowGroups/i "AllowGroups" |
|
- let allow_users = array_entry /AllowUsers/i "AllowUsers" |
|
- let deny_groups = array_entry /DenyGroups/i "DenyGroups" |
|
- let deny_users = array_entry /DenyUsers/i "DenyUsers" |
|
+ let allow_groups = array_entry "AllowGroups" |
|
+ let allow_users = array_entry "AllowUsers" |
|
+ let deny_groups = array_entry "DenyGroups" |
|
+ let deny_users = array_entry "DenyUsers" |
|
|
|
let subsystemvalue = |
|
let value = store (/[^ \t\n](.*[^ \t\n])?/) in |
|
[ key /[A-Za-z0-9\-]+/ . sep . value . eol ] |
|
|
|
let subsystem = |
|
- [ key /Subsystem/i . sep . subsystemvalue ] |
|
+ [ key "Subsystem" . sep . subsystemvalue ] |
|
|
|
- let list (kw:regexp) (sq:string) = |
|
- let value = store /[^, \t\n]+/ in |
|
- [ key kw . sep . |
|
- [ seq sq . value ] . |
|
- ([ seq sq . Util.del_str "," . value])* . |
|
+ let macs = |
|
+ let mac_value = store /[^, \t\n]+/ in |
|
+ [ key "MACs" . sep . |
|
+ [ seq "macs" . mac_value ] . |
|
+ ([ seq "macs" . Util.del_str "," . mac_value])* . |
|
eol ] |
|
|
|
- let macs = list /MACs/i "MACs" |
|
- |
|
- let ciphers = list /Ciphers/i "Ciphers" |
|
- |
|
- let kexalgorithms = list /KexAlgorithms/i "KexAlgorithms" |
|
- |
|
- let entry = accept_env | allow_groups | allow_users |
|
- | deny_groups | subsystem | deny_users |
|
- | macs | ciphers | kexalgorithms |
|
- | other_entry |
|
- |
|
let condition_entry = |
|
let value = store /[^ \t\n]+/ in |
|
[ sep . key /[A-Za-z0-9]+/ . sep . value ] |
|
@@ -126,15 +112,17 @@ module Sshd = |
|
let match_cond = |
|
[ label "Condition" . condition_entry+ . eol ] |
|
|
|
- let match_entry = indent . (entry | comment_noindent) |
|
- | empty |
|
+ let match_entry = |
|
+ ( comment | empty | (Util.indent . other_entry) ) |
|
|
|
let match = |
|
- [ key /Match/i . match_cond |
|
+ [ key "Match" . match_cond |
|
. [ label "Settings" . match_entry+ ] |
|
] |
|
|
|
- let lns = (entry | comment | empty)* . match* |
|
+ let lns = (comment | empty | accept_env | allow_groups | allow_users |
|
+ | deny_groups | subsystem | deny_users | macs |
|
+ | other_entry ) * . match* |
|
|
|
let xfm = transform lns (incl "/etc/ssh/sshd_config") |
|
|
|
diff --git a/lenses/sshd_140.aug b/lenses/sshd_140.aug |
|
new file mode 100644 |
|
index 00000000..8a7f176f |
|
--- /dev/null |
|
+++ b/lenses/sshd_140.aug |
|
@@ -0,0 +1,141 @@ |
|
+(* |
|
+Module: Sshd_140 |
|
+ Parses /etc/ssh/sshd_config |
|
+ |
|
+ This module is compatible with Augeas 1.4.0, but is not loaded by default. |
|
+ |
|
+Author: David Lutterkort lutter@redhat.com |
|
+ Dominique Dumont dominique.dumont@hp.com |
|
+ |
|
+About: Reference |
|
+ sshd_config man page. |
|
+ See http://www.openbsd.org/cgi-bin/man.cgi?query=sshd_config&sektion=5 |
|
+ |
|
+About: License |
|
+ This file is licensed under the LGPL v2+. |
|
+ |
|
+About: Lens Usage |
|
+ Sample usage of this lens in augtool: |
|
+ |
|
+ * Get your current setup |
|
+ > print /files/etc/ssh/sshd_config |
|
+ ... |
|
+ |
|
+ * Set X11Forwarding to "no" |
|
+ > set /files/etc/ssh/sshd_config/X11Forwarding "no" |
|
+ |
|
+ More advanced usage: |
|
+ |
|
+ * Set a Match section |
|
+ > set /files/etc/ssh/sshd_config/Match[1]/Condition/User "foo" |
|
+ > set /files/etc/ssh/sshd_config/Match[1]/Settings/X11Forwarding "yes" |
|
+ |
|
+ Saving your file: |
|
+ |
|
+ > save |
|
+ |
|
+ |
|
+About: CAVEATS |
|
+ |
|
+ In sshd_config, Match blocks must be located at the end of the file. |
|
+ This means that any new "global" parameters (i.e. outside of a Match |
|
+ block) must be written before the first Match block. By default, |
|
+ Augeas will write new parameters at the end of the file. |
|
+ |
|
+ I.e. if you have a Match section and no ChrootDirectory parameter, |
|
+ this command: |
|
+ |
|
+ > set /files/etc/ssh/sshd_config/ChrootDirectory "foo" |
|
+ |
|
+ will be stored in a new node after the Match section and Augeas will |
|
+ refuse to save sshd_config file. |
|
+ |
|
+ To create a new parameter as the right place, you must first create |
|
+ a new Augeas node before the Match section: |
|
+ |
|
+ > ins ChrootDirectory before /files/etc/ssh/sshd_config/Match |
|
+ |
|
+ Then, you can set the parameter |
|
+ |
|
+ > set /files/etc/ssh/sshd_config/ChrootDirectory "foo" |
|
+ |
|
+ |
|
+About: Configuration files |
|
+ This lens applies to /etc/ssh/sshd_config |
|
+ |
|
+*) |
|
+ |
|
+module Sshd_140 = |
|
+ let eol = del /[ \t]*\n/ "\n" |
|
+ |
|
+ let sep = Util.del_ws_spc |
|
+ |
|
+ let indent = del /[ \t]*/ " " |
|
+ |
|
+ let key_re = /[A-Za-z0-9]+/ |
|
+ - /MACs|Match|AcceptEnv|Subsystem|Ciphers|KexAlgorithms|(Allow|Deny)(Groups|Users)/i |
|
+ |
|
+ let comment = Util.comment |
|
+ let comment_noindent = Util.comment_noindent |
|
+ let empty = Util.empty |
|
+ |
|
+ let array_entry (kw:regexp) (sq:string) = |
|
+ let value = store /[^ \t\n]+/ in |
|
+ [ key kw . [ sep . seq sq . value]* . eol ] |
|
+ |
|
+ let other_entry = |
|
+ let value = store /[^ \t\n]+([ \t]+[^ \t\n]+)*/ in |
|
+ [ key key_re . sep . value . eol ] |
|
+ |
|
+ let accept_env = array_entry /AcceptEnv/i "AcceptEnv" |
|
+ |
|
+ let allow_groups = array_entry /AllowGroups/i "AllowGroups" |
|
+ let allow_users = array_entry /AllowUsers/i "AllowUsers" |
|
+ let deny_groups = array_entry /DenyGroups/i "DenyGroups" |
|
+ let deny_users = array_entry /DenyUsers/i "DenyUsers" |
|
+ |
|
+ let subsystemvalue = |
|
+ let value = store (/[^ \t\n](.*[^ \t\n])?/) in |
|
+ [ key /[A-Za-z0-9\-]+/ . sep . value . eol ] |
|
+ |
|
+ let subsystem = |
|
+ [ key /Subsystem/i . sep . subsystemvalue ] |
|
+ |
|
+ let list (kw:regexp) (sq:string) = |
|
+ let value = store /[^, \t\n]+/ in |
|
+ [ key kw . sep . |
|
+ [ seq sq . value ] . |
|
+ ([ seq sq . Util.del_str "," . value])* . |
|
+ eol ] |
|
+ |
|
+ let macs = list /MACs/i "MACs" |
|
+ |
|
+ let ciphers = list /Ciphers/i "Ciphers" |
|
+ |
|
+ let kexalgorithms = list /KexAlgorithms/i "KexAlgorithms" |
|
+ |
|
+ let entry = accept_env | allow_groups | allow_users |
|
+ | deny_groups | subsystem | deny_users |
|
+ | macs | ciphers | kexalgorithms |
|
+ | other_entry |
|
+ |
|
+ let condition_entry = |
|
+ let value = store /[^ \t\n]+/ in |
|
+ [ sep . key /[A-Za-z0-9]+/ . sep . value ] |
|
+ |
|
+ let match_cond = |
|
+ [ label "Condition" . condition_entry+ . eol ] |
|
+ |
|
+ let match_entry = indent . (entry | comment_noindent) |
|
+ | empty |
|
+ |
|
+ let match = |
|
+ [ key /Match/i . match_cond |
|
+ . [ label "Settings" . match_entry+ ] |
|
+ ] |
|
+ |
|
+ let lns = (entry | comment | empty)* . match* |
|
+ |
|
+(* Local Variables: *) |
|
+(* mode: caml *) |
|
+(* End: *) |
|
diff --git a/lenses/tests/test_sshd.aug b/lenses/tests/test_sshd.aug |
|
index 5954e16f..788a12f0 100644 |
|
--- a/lenses/tests/test_sshd.aug |
|
+++ b/lenses/tests/test_sshd.aug |
|
@@ -1,4 +1,3 @@ |
|
-(* Module: Test_sshd *) |
|
module Test_sshd = |
|
|
|
let accept_env = "Protocol 2 |
|
@@ -75,61 +74,6 @@ Match User sarko Group pres.* |
|
Match User bush Group pres.* Host white.house.* |
|
Banner /etc/welcome.txt\n" |
|
|
|
-(* Test: Sshd.lns |
|
- Indent when adding to a Match group *) |
|
- test Sshd.lns put match_blocks after |
|
- set "Match[1]/Settings/PermitRootLogin" "yes"; |
|
- set "Match[1]/Settings/#comment" "a comment" = |
|
-"X11Forwarding yes |
|
-Match User sarko Group pres.* |
|
- Banner /etc/bienvenue.txt |
|
- X11Forwarding no |
|
- PermitRootLogin yes |
|
- # a comment |
|
-Match User bush Group pres.* Host white.house.* |
|
-Banner /etc/welcome.txt\n" |
|
- |
|
- |
|
-(* Test: Sshd.lns |
|
- Parse Ciphers and KexAlgorithms as lists (GH issue #69) *) |
|
-test Sshd.lns get "Ciphers aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes128-ctr |
|
-KexAlgorithms diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1\n" = |
|
- { "Ciphers" |
|
- { "1" = "aes256-gcm@openssh.com" } |
|
- { "2" = "aes128-gcm@openssh.com" } |
|
- { "3" = "aes256-ctr" } |
|
- { "4" = "aes128-ctr" } |
|
- } |
|
- { "KexAlgorithms" |
|
- { "1" = "diffie-hellman-group-exchange-sha256" } |
|
- { "2" = "diffie-hellman-group14-sha1" } |
|
- { "3" = "diffie-hellman-group-exchange-sha1" } |
|
- } |
|
- |
|
-(* Test: Sshd.lns |
|
- Keys are case-insensitive *) |
|
-test Sshd.lns get "ciPheRs aes256-gcm@openssh.com,aes128-ctr |
|
-maTcH User foo |
|
- x11forwarding no\n" = |
|
- { "ciPheRs" |
|
- { "1" = "aes256-gcm@openssh.com" } |
|
- { "2" = "aes128-ctr" } |
|
- } |
|
- { "maTcH" |
|
- { "Condition" |
|
- { "User" = "foo" } |
|
- } |
|
- { "Settings" |
|
- { "x11forwarding" = "no" } |
|
- } |
|
- } |
|
- |
|
-(* Test: Sshd.lns |
|
- Allow AllowGroups in Match groups (GH issue #75) *) |
|
-test Sshd.lns get "Match User foo |
|
-AllowGroups users\n" = |
|
- { "Match" { "Condition" { "User" = "foo" } } |
|
- { "Settings" { "AllowGroups" { "1" = "users" } } } } |
|
|
|
(* Local Variables: *) |
|
(* mode: caml *) |
|
diff --git a/lenses/tests/test_sshd_140.aug b/lenses/tests/test_sshd_140.aug |
|
new file mode 100644 |
|
index 00000000..056c53f9 |
|
--- /dev/null |
|
+++ b/lenses/tests/test_sshd_140.aug |
|
@@ -0,0 +1,136 @@ |
|
+(* Module: Test_sshd_140 *) |
|
+module Test_sshd_140 = |
|
+ |
|
+ let accept_env = "Protocol 2 |
|
+AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT |
|
+AcceptEnv LC_IDENTIFICATION LC_ALL\n" |
|
+ |
|
+ test Sshd_140.lns get accept_env = |
|
+ { "Protocol" = "2" } |
|
+ { "AcceptEnv" |
|
+ { "1" = "LC_PAPER" } |
|
+ { "2" = "LC_NAME" } |
|
+ { "3" = "LC_ADDRESS" } |
|
+ { "4" = "LC_TELEPHONE" } |
|
+ { "5" = "LC_MEASUREMENT" } } |
|
+ { "AcceptEnv" |
|
+ { "6" = "LC_IDENTIFICATION" } |
|
+ { "7" = "LC_ALL" } } |
|
+ |
|
+ |
|
+ test Sshd_140.lns get "HostKey /etc/ssh/ssh_host_rsa_key |
|
+HostKey /etc/ssh/ssh_host_dsa_key\n" = |
|
+ { "HostKey" = "/etc/ssh/ssh_host_rsa_key" } |
|
+ { "HostKey" = "/etc/ssh/ssh_host_dsa_key" } |
|
+ |
|
+ |
|
+ test Sshd_140.lns put accept_env after |
|
+ rm "AcceptEnv"; |
|
+ rm "AcceptEnv"; |
|
+ set "Protocol" "1.5"; |
|
+ set "X11Forwarding" "yes" |
|
+ = "Protocol 1.5\nX11Forwarding yes\n" |
|
+ |
|
+ test Sshd_140.lns get "AuthorizedKeysFile %h/.ssh/authorized_keys\n" = |
|
+ { "AuthorizedKeysFile" = "%h/.ssh/authorized_keys" } |
|
+ |
|
+ test Sshd_140.lns get "Subsystem sftp /usr/lib/openssh/sftp-server\n" = |
|
+ { "Subsystem" |
|
+ { "sftp" = "/usr/lib/openssh/sftp-server" } } |
|
+ |
|
+ test Sshd_140.lns get "Subsystem sftp-test /usr/lib/openssh/sftp-server\n" = |
|
+ { "Subsystem" |
|
+ { "sftp-test" = "/usr/lib/openssh/sftp-server" } } |
|
+ |
|
+ |
|
+ |
|
+ let match_blocks = "X11Forwarding yes |
|
+Match User sarko Group pres.* |
|
+ Banner /etc/bienvenue.txt |
|
+ X11Forwarding no |
|
+Match User bush Group pres.* Host white.house.* |
|
+Banner /etc/welcome.txt |
|
+" |
|
+ test Sshd_140.lns get match_blocks = |
|
+ { "X11Forwarding" = "yes"} |
|
+ { "Match" |
|
+ { "Condition" { "User" = "sarko" } |
|
+ { "Group" = "pres.*" } } |
|
+ { "Settings" { "Banner" = "/etc/bienvenue.txt" } |
|
+ { "X11Forwarding" = "no" } } } |
|
+ { "Match" |
|
+ { "Condition" { "User" = "bush" } |
|
+ { "Group" = "pres.*" } |
|
+ { "Host" = "white.house.*" } } |
|
+ { "Settings" { "Banner" = "/etc/welcome.txt" } } } |
|
+ |
|
+ test Sshd_140.lns put match_blocks after |
|
+ insb "Subsystem" "/Match[1]"; |
|
+ set "/Subsystem/sftp" "/usr/libexec/openssh/sftp-server" |
|
+ = "X11Forwarding yes |
|
+Subsystem sftp /usr/libexec/openssh/sftp-server |
|
+Match User sarko Group pres.* |
|
+ Banner /etc/bienvenue.txt |
|
+ X11Forwarding no |
|
+Match User bush Group pres.* Host white.house.* |
|
+Banner /etc/welcome.txt\n" |
|
+ |
|
+(* Test: Sshd_140.lns |
|
+ Indent when adding to a Match group *) |
|
+ test Sshd_140.lns put match_blocks after |
|
+ set "Match[1]/Settings/PermitRootLogin" "yes"; |
|
+ set "Match[1]/Settings/#comment" "a comment" = |
|
+"X11Forwarding yes |
|
+Match User sarko Group pres.* |
|
+ Banner /etc/bienvenue.txt |
|
+ X11Forwarding no |
|
+ PermitRootLogin yes |
|
+ # a comment |
|
+Match User bush Group pres.* Host white.house.* |
|
+Banner /etc/welcome.txt\n" |
|
+ |
|
+ |
|
+(* Test: Sshd_140.lns |
|
+ Parse Ciphers and KexAlgorithms as lists (GH issue #69) *) |
|
+test Sshd_140.lns get "Ciphers aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes128-ctr |
|
+KexAlgorithms diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1\n" = |
|
+ { "Ciphers" |
|
+ { "1" = "aes256-gcm@openssh.com" } |
|
+ { "2" = "aes128-gcm@openssh.com" } |
|
+ { "3" = "aes256-ctr" } |
|
+ { "4" = "aes128-ctr" } |
|
+ } |
|
+ { "KexAlgorithms" |
|
+ { "1" = "diffie-hellman-group-exchange-sha256" } |
|
+ { "2" = "diffie-hellman-group14-sha1" } |
|
+ { "3" = "diffie-hellman-group-exchange-sha1" } |
|
+ } |
|
+ |
|
+(* Test: Sshd_140.lns |
|
+ Keys are case-insensitive *) |
|
+test Sshd_140.lns get "ciPheRs aes256-gcm@openssh.com,aes128-ctr |
|
+maTcH User foo |
|
+ x11forwarding no\n" = |
|
+ { "ciPheRs" |
|
+ { "1" = "aes256-gcm@openssh.com" } |
|
+ { "2" = "aes128-ctr" } |
|
+ } |
|
+ { "maTcH" |
|
+ { "Condition" |
|
+ { "User" = "foo" } |
|
+ } |
|
+ { "Settings" |
|
+ { "x11forwarding" = "no" } |
|
+ } |
|
+ } |
|
+ |
|
+(* Test: Sshd_140.lns |
|
+ Allow AllowGroups in Match groups (GH issue #75) *) |
|
+test Sshd_140.lns get "Match User foo |
|
+AllowGroups users\n" = |
|
+ { "Match" { "Condition" { "User" = "foo" } } |
|
+ { "Settings" { "AllowGroups" { "1" = "users" } } } } |
|
+ |
|
+(* Local Variables: *) |
|
+(* mode: caml *) |
|
+(* End: *) |
|
diff --git a/tests/Makefile.am b/tests/Makefile.am |
|
index b4563540..387ac7d2 100644 |
|
--- a/tests/Makefile.am |
|
+++ b/tests/Makefile.am |
|
@@ -189,6 +189,7 @@ lens_tests = \ |
|
lens-squid.sh \ |
|
lens-ssh.sh \ |
|
lens-sshd.sh \ |
|
+ lens-sshd_140.sh \ |
|
lens-sssd.sh \ |
|
lens-stunnel.sh \ |
|
lens-subversion.sh \ |
|
-- |
|
2.13.6
|
|
|