CloudyScripts 1.6.1 → 1.7.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. data/Rakefile +1 -1
  2. data/lib/audit/checks/APACHE2.group +6 -0
  3. data/lib/audit/checks/APACHE2_CONFIG_01.check +36 -0
  4. data/lib/audit/checks/APACHE2_CONFIG_02.check +34 -0
  5. data/lib/audit/checks/APACHE2_CONFIG_03.check +60 -0
  6. data/lib/audit/checks/APACHE2_CONFIG_04.check +23 -0
  7. data/lib/audit/checks/APACHE2_CONFIG_05.check +23 -0
  8. data/lib/audit/checks/APACHE2_CONFIG_06.check +30 -0
  9. data/lib/audit/checks/APACHE2_INIT_1.check +14 -0
  10. data/lib/audit/checks/APACHE2_INIT_2.check +66 -0
  11. data/lib/audit/checks/APACHE2_INIT_3.check +13 -0
  12. data/lib/audit/checks/APACHE2_USER_7.check +17 -0
  13. data/lib/audit/checks/BACKUP_HOME_DOTFILES.check +26 -0
  14. data/lib/audit/checks/BACKUP_LOG.check +24 -0
  15. data/lib/audit/checks/BACKUP_MAIL.check +19 -0
  16. data/lib/audit/checks/BACKUP_WEB.check +12 -0
  17. data/lib/audit/checks/CONFIGURATION_BACKUP.check +14 -0
  18. data/lib/audit/checks/DIRECTORY_LISTING.check +14 -0
  19. data/lib/audit/checks/DISTRIBUTION_FACTS.check +60 -0
  20. data/lib/audit/checks/DMESG_OUTPUT.check +14 -0
  21. data/lib/audit/checks/FIND_GROUP_FILE.check +6 -0
  22. data/lib/audit/checks/FIND_PASSWD_FILE.check +8 -0
  23. data/lib/audit/checks/FIND_SHADOW_FILE.check +5 -0
  24. data/lib/audit/checks/FIND_SUDOERS_FILE.check +6 -0
  25. data/lib/audit/checks/FREE_SPACE.check +26 -0
  26. data/lib/audit/checks/HAS_AWK.check +30 -0
  27. data/lib/audit/checks/HAS_BASE.check +21 -0
  28. data/lib/audit/checks/HAS_CAT.check +18 -0
  29. data/lib/audit/checks/HAS_COMPRESSOR.check +30 -0
  30. data/lib/audit/checks/HAS_CUT.check +18 -0
  31. data/lib/audit/checks/HAS_DF.check +19 -0
  32. data/lib/audit/checks/HAS_DPKG.check +18 -0
  33. data/lib/audit/checks/HAS_FILE_DOWNLOADER.check +32 -0
  34. data/lib/audit/checks/HAS_FIND.check +18 -0
  35. data/lib/audit/checks/HAS_GREP.check +19 -0
  36. data/lib/audit/checks/HAS_GROUPCHECK.check +23 -0
  37. data/lib/audit/checks/HAS_GROUPS.check +19 -0
  38. data/lib/audit/checks/HAS_HOSTNAME.check +7 -0
  39. data/lib/audit/checks/HAS_ID.check +7 -0
  40. data/lib/audit/checks/HAS_LSB_RELEASE.check +16 -0
  41. data/lib/audit/checks/HAS_MOUNT.check +19 -0
  42. data/lib/audit/checks/HAS_NETSTAT.check +20 -0
  43. data/lib/audit/checks/HAS_PASSWD_CHECK.check +17 -0
  44. data/lib/audit/checks/HAS_PS.check +19 -0
  45. data/lib/audit/checks/HAS_ROUTE.check +19 -0
  46. data/lib/audit/checks/HAS_SH.check +19 -0
  47. data/lib/audit/checks/HAS_SORT.check +17 -0
  48. data/lib/audit/checks/HAS_STAT.check +17 -0
  49. data/lib/audit/checks/HAS_SUPERUSER.check +11 -0
  50. data/lib/audit/checks/HAS_TAIL.check +16 -0
  51. data/lib/audit/checks/HAS_TAR.check +7 -0
  52. data/lib/audit/checks/HAS_TR.check +22 -0
  53. data/lib/audit/checks/HAS_UNAME.check +7 -0
  54. data/lib/audit/checks/HAS_UNIQ.check +17 -0
  55. data/lib/audit/checks/HAS_WC.check +16 -0
  56. data/lib/audit/checks/HAS_WHO.check +18 -0
  57. data/lib/audit/checks/HAS_YUM.check +18 -0
  58. data/lib/audit/checks/LASTLOG.check +28 -0
  59. data/lib/audit/checks/LIST_ROUTES.check +33 -0
  60. data/lib/audit/checks/LIST_USER_ACCOUNTS.check +25 -0
  61. data/lib/audit/checks/LOADED_MODULES.check +22 -0
  62. data/lib/audit/checks/LOCAL_NMAP.check +97 -0
  63. data/lib/audit/checks/LOGGED_USERS.check +28 -0
  64. data/lib/audit/checks/LYNIS_AUTH.group +9 -0
  65. data/lib/audit/checks/LYNIS_AUTH_9204.check +43 -0
  66. data/lib/audit/checks/LYNIS_AUTH_9208.check +35 -0
  67. data/lib/audit/checks/LYNIS_AUTH_9216.check +24 -0
  68. data/lib/audit/checks/LYNIS_AUTH_9222.check +25 -0
  69. data/lib/audit/checks/LYNIS_AUTH_9226.check +24 -0
  70. data/lib/audit/checks/LYNIS_AUTH_9228.check +24 -0
  71. data/lib/audit/checks/LYNIS_AUTH_9252.check +19 -0
  72. data/lib/audit/checks/MAYBE_HAS_BZIP2.check +17 -0
  73. data/lib/audit/checks/MAYBE_HAS_CURL.check +17 -0
  74. data/lib/audit/checks/MAYBE_HAS_DU.check +17 -0
  75. data/lib/audit/checks/MAYBE_HAS_HOSTNAME.check +17 -0
  76. data/lib/audit/checks/MAYBE_HAS_ID.check +17 -0
  77. data/lib/audit/checks/MAYBE_HAS_LSB_RELEASE.check +15 -0
  78. data/lib/audit/checks/MAYBE_HAS_SUPERUSER.check +36 -0
  79. data/lib/audit/checks/MAYBE_HAS_TAR.check +19 -0
  80. data/lib/audit/checks/MAYBE_HAS_UNAME.check +17 -0
  81. data/lib/audit/checks/MAYBE_HAS_WGET.check +17 -0
  82. data/lib/audit/checks/MOUNTED_DEVICES.check +22 -0
  83. data/lib/audit/checks/MYSQL_HISTORY_1.check +29 -0
  84. data/lib/audit/checks/MYSQL_INIT_1.check +9 -0
  85. data/lib/audit/checks/MYSQL_INIT_2.check +12 -0
  86. data/lib/audit/checks/MYSQL_INIT_3.check +7 -0
  87. data/lib/audit/checks/PACKAGES_INSTALLED_DPKG.check +38 -0
  88. data/lib/audit/checks/PACKAGES_INSTALLED_YUM.check +36 -0
  89. data/lib/audit/checks/PASSWORD_INFORMATION.check +33 -0
  90. data/lib/audit/checks/PLATFORM_FACTS.check +35 -0
  91. data/lib/audit/checks/PORTS_OPEN_NETSTAT.check +121 -0
  92. data/lib/audit/checks/PROCESS_LIST.check +87 -0
  93. data/lib/audit/checks/SLOW.group +7 -0
  94. data/lib/audit/checks/SLOW_1.check +4 -0
  95. data/lib/audit/checks/SLOW_2.check +4 -0
  96. data/lib/audit/checks/SLOW_3.check +4 -0
  97. data/lib/audit/checks/SSH.group +14 -0
  98. data/lib/audit/checks/SSH_CONFIG_01.check +12 -0
  99. data/lib/audit/checks/SSH_CONFIG_02.check +15 -0
  100. data/lib/audit/checks/SSH_CONFIG_03.check +13 -0
  101. data/lib/audit/checks/SSH_CONFIG_04.check +11 -0
  102. data/lib/audit/checks/SSH_CONFIG_05.check +12 -0
  103. data/lib/audit/checks/SSH_CONFIG_06.check +12 -0
  104. data/lib/audit/checks/SSH_CONFIG_07.check +11 -0
  105. data/lib/audit/checks/SSH_CONFIG_08.check +12 -0
  106. data/lib/audit/checks/SSH_CONFIG_09.check +12 -0
  107. data/lib/audit/checks/SSH_CONFIG_10.check +15 -0
  108. data/lib/audit/checks/SSH_CONFIG_11.check +14 -0
  109. data/lib/audit/checks/SSH_INIT_1.check +9 -0
  110. data/lib/audit/checks/SSH_INIT_2.check +12 -0
  111. data/lib/audit/checks/SSH_KEYS_1.check +32 -0
  112. data/lib/audit/checks/USERS_INIT_1.check +9 -0
  113. data/lib/audit/checks/USERS_INIT_2.check +5 -0
  114. data/lib/audit/checks/USERS_INIT_3.check +5 -0
  115. data/lib/audit/checks/USERS_INIT_4.check +9 -0
  116. data/lib/audit/checks/USERS_INIT_5.check +10 -0
  117. data/lib/audit/checks/USER_INFORMATION.check +29 -0
  118. data/lib/audit/checks/VARIOUS.group +19 -0
  119. data/lib/audit/checks/VAR_LIST_HOME_DIRECTORIES.check +5 -0
  120. data/lib/audit/checks/benchmark.group +6 -0
  121. data/lib/audit/checks/footer.template +12 -0
  122. data/lib/audit/checks/header.template +10 -0
  123. data/lib/audit/checks/helpers/head.sh +59 -0
  124. data/lib/audit/checks/script_header.template +69 -0
  125. data/lib/audit/create_benchmark.sh +93 -0
  126. data/lib/audit/lib/audit.rb +136 -0
  127. data/lib/audit/lib/audit_facade.rb +5 -0
  128. data/lib/audit/lib/benchmark/audit_benchmark.rb +165 -0
  129. data/lib/audit/lib/benchmark/automatic_dependencies.rb +13 -0
  130. data/lib/audit/lib/benchmark/benchmark_factory.rb +23 -0
  131. data/lib/audit/lib/benchmark/benchmark_result.rb +25 -0
  132. data/lib/audit/lib/benchmark/check.rb +34 -0
  133. data/lib/audit/lib/benchmark/group.rb +30 -0
  134. data/lib/audit/lib/benchmark/item_exception.rb +13 -0
  135. data/lib/audit/lib/benchmark/result_code.rb +11 -0
  136. data/lib/audit/lib/benchmark/rule_result.rb +42 -0
  137. data/lib/audit/lib/benchmark/rule_role.rb +5 -0
  138. data/lib/audit/lib/benchmark/rule_severity.rb +13 -0
  139. data/lib/audit/lib/benchmark/yaml_benchmark.rb +133 -0
  140. data/lib/audit/lib/connection/ami_connection.rb +4 -0
  141. data/lib/audit/lib/connection/connection_factory.rb +27 -0
  142. data/lib/audit/lib/connection/ssh_connection.rb +243 -0
  143. data/lib/audit/lib/ec2_utils.rb +245 -0
  144. data/lib/audit/lib/http_fingerprint.rb +116 -0
  145. data/lib/audit/lib/lazy.rb +37 -0
  146. data/lib/audit/lib/linear_script_generator.rb +31 -0
  147. data/lib/audit/lib/main.rb +13 -0
  148. data/lib/audit/lib/my_option_parser.rb +106 -0
  149. data/lib/audit/lib/nessus_new.rb +290 -0
  150. data/lib/audit/lib/nessus_utils.rb +102 -0
  151. data/lib/audit/lib/parser/command/abstract_command.rb +32 -0
  152. data/lib/audit/lib/parser/command/abstract_command_result.rb +30 -0
  153. data/lib/audit/lib/parser/command/attach_file_command.rb +63 -0
  154. data/lib/audit/lib/parser/command/check_finished_command.rb +45 -0
  155. data/lib/audit/lib/parser/command/cpe_name_command.rb +37 -0
  156. data/lib/audit/lib/parser/command/data_command.rb +43 -0
  157. data/lib/audit/lib/parser/command/listening_port_command.rb +46 -0
  158. data/lib/audit/lib/parser/command/message_command.rb +21 -0
  159. data/lib/audit/lib/parser/command/program_name_command.rb +42 -0
  160. data/lib/audit/lib/parser/parse_exception.rb +2 -0
  161. data/lib/audit/lib/parser/result_type.rb +13 -0
  162. data/lib/audit/lib/parser/script_output_parser.rb +201 -0
  163. data/lib/audit/lib/parser/stdout_line_buffer.rb +43 -0
  164. data/lib/audit/lib/ssh_fingerprint.rb +220 -0
  165. data/lib/audit/lib/ssh_fingerprint2.rb +170 -0
  166. data/lib/audit/lib/ssh_utils.rb +292 -0
  167. data/lib/audit/lib/transformers/web_view_transformer.rb +171 -0
  168. data/lib/audit/lib/transformers/yaml_transformer.rb +50 -0
  169. data/lib/audit/lib/util/random_string.rb +22 -0
  170. data/lib/audit/lib/version.rb +7 -0
  171. data/lib/help/ec2_helper.rb +65 -2
  172. data/lib/help/remote_command_handler.rb +17 -0
  173. data/lib/help/state_transition_helper.rb +8 -0
  174. data/lib/scripts/ec2/open_port_checker.rb +112 -0
  175. data/lib/scripts/ec2/port_range_detector.rb +0 -1
  176. metadata +175 -16
@@ -0,0 +1,97 @@
1
+ ID: LOCAL_NMAP
2
+ Name: Run local nmap for fingerprinting purposes
3
+ Description: >
4
+ Extract all information from the /etc/passwd file
5
+ and export it as key/value pairs.
6
+ Depends: [HAS_TAR, HAS_UNAME, HAS_HOSTNAME, HAS_FILE_DOWNLOADER, MAYBE_HAS_SUPERUSER]
7
+ Imports: [SHADOW_FILE, PASSWD_FILE, CAT, CUT, RUN_AS_SUPERUSER]
8
+ Script: |
9
+ TMP_NMAP_LIGHT_TEXT_OUTPUT="${AUDIT_DIRECTORY}/nmap_light.log"
10
+ TMP_NMAP_LIGHT_XML_OUTPUT="${AUDIT_DIRECTORY}/nmap_light.xml"
11
+ TMP_NMAP_LIGHT_NONROOT_PARAMS="-vv -p 0-65535 -Pn -sV --version-light -script=default,ssh2-enum-algos,ssh-hostkey --host-timeout 2m"
12
+ TMP_NMAP_LIGHT_ROOT_PARAMS="-O --osscan-limit"
13
+
14
+ TMP_NMAP_THOROUGH_TEXT_OUTPUT="${AUDIT_DIRECTORY}/nmap_thorough.log"
15
+ TMP_NMAP_THOROUGH_XML_OUTPUT="${AUDIT_DIRECTORY}/nmap_thorough.xml"
16
+ TMP_NMAP_THOROUGH_NONROOT_PARAMS="-vv -p 0-65535 -Pn -sV --version-all -script=default,ssh2-enum-algos,ssh-hostkey --host-timeout 5m"
17
+ TMP_NMAP_THOROUGH_ROOT_PARAMS="-O --osscan-guess"
18
+
19
+ TMP_NMAP="" # this is the path of the nmap program that will be started
20
+ TMP_NMAP_DIR="" # nmap directory is used to delete copied nmap
21
+ TMP_NMAP_LIGHT_EXIT_CODE=1
22
+ TMP_NMAP_THOROUGH_EXIT_CODE=1
23
+ TMP_ARCH=$( ${UNAME} -m )
24
+
25
+ # download nmap and unpack it
26
+ case "${TMP_ARCH}" in
27
+ i686)
28
+ TMP_NMAP_ARCHIVE="nmap-5.51-x86-tmp.tar.bz2"
29
+ ${DOWNLOAD_FILE} "/tmp/${TMP_NMAP_ARCHIVE}" "http://home.in.tum.de/zaddach/var/${TMP_NMAP_ARCHIVE}" 2>/dev/null 1>/dev/null
30
+ if [ ! -f "/tmp/${TMP_NMAP_ARCHIVE}" ]
31
+ then
32
+ script_error_message "Downloading of NMap archive ${TMP_NMAP_ARCHIVE} failed"
33
+ else
34
+ ${TAR} xjf "/tmp/${TMP_NMAP_ARCHIVE}" -C /
35
+ TMP_NMAP_DIR="/tmp/nmap-5.51-x86"
36
+ TMP_NMAP="/tmp/nmap-5.51-x86/bin/nmap"
37
+ fi
38
+ ;;
39
+ x86_64)
40
+ TMP_NMAP_ARCHIVE="nmap-5.51-x64-tmp.tar.bz2"
41
+ ${DOWNLOAD_FILE} "/tmp/${TMP_NMAP_ARCHIVE}" "http://home.in.tum.de/zaddach/var/${TMP_NMAP_ARCHIVE}" 2>/dev/null 1>/dev/null
42
+ if [ ! -f "/tmp/${TMP_NMAP_ARCHIVE}" ]
43
+ then
44
+ script_error_message "Downloading of NMap archive ${TMP_NMAP_ARCHIVE} failed"
45
+ else
46
+ ${TAR} xjf "/tmp/${TMP_NMAP_ARCHIVE}" -C /
47
+ TMP_NMAP_DIR="/tmp/nmap-5.51-x64"
48
+ TMP_NMAP="/tmp/nmap-5.51-x64/bin/nmap"
49
+ fi
50
+ ;;
51
+ *)
52
+ script_error_message "Unknown architecture ${TMP_ARCH}"
53
+ ;;
54
+ esac
55
+
56
+ # if an nmap was installed
57
+ if [ ! "${TMP_NMAP}" = "" ]
58
+ then
59
+ if [ "${HAS_SUPERUSER}" = "yes" ]
60
+ then
61
+ # if superuser possible, execute nmap with superuser rights
62
+ ${RUN_AS_SUPERUSER} ${TMP_NMAP} -oX "${TMP_NMAP_LIGHT_XML_OUTPUT}" -oN "${TMP_NMAP_LIGHT_TEXT_OUTPUT}" ${TMP_NMAP_LIGHT_NONROOT_PARAMS} ${TMP_NMAP_LIGHT_ROOT_PARAMS} $( ${HOSTNAME} ) 2>/dev/null 1>/dev/null
63
+ TMP_NMAP_LIGHT_EXIT_CODE=$?
64
+ ${RUN_AS_SUPERUSER} ${TMP_NMAP} -oX "${TMP_NMAP_THOROUGH_XML_OUTPUT}" -oN "${TMP_NMAP_THOROUGH_TEXT_OUTPUT}" ${TMP_NMAP_THOROUGH_NONROOT_PARAMS} ${TMP_NMAP_THOROUGH_ROOT_PARAMS} $( ${HOSTNAME} ) 2>/dev/null 1>/dev/null
65
+ TMP_NMAP_THOROUGH_EXIT_CODE=$?
66
+ else
67
+ ${TMP_NMAP} -oX "${TMP_NMAP_LIGHT_XML_OUTPUT}" -oN "${TMP_NMAP_LIGHT_TEXT_OUTPUT}" ${TMP_NMAP_LIGHT_NONROOT_PARAMS} $( ${HOSTNAME} ) 2>/dev/null 1>/dev/null
68
+ TMP_NMAP_LIGHT_EXIT_CODE=$?
69
+ ${TMP_NMAP} -oX "${TMP_NMAP_THOROUGH_XML_OUTPUT}" -oN "${TMP_NMAP_THOROUGH_TEXT_OUTPUT}" ${TMP_NMAP_THOROUGH_NONROOT_PARAMS} $( ${HOSTNAME} ) 2>/dev/null 1>/dev/null
70
+ TMP_NMAP_THOROUGH_EXIT_CODE=$?
71
+ fi
72
+
73
+ script_attach_file "${TMP_NMAP_LIGHT_TEXT_OUTPUT}"
74
+ script_attach_file "${TMP_NMAP_LIGHT_XML_OUTPUT}"
75
+ script_attach_file "${TMP_NMAP_THOROUGH_TEXT_OUTPUT}"
76
+ script_attach_file "${TMP_NMAP_THOROUGH_XML_OUTPUT}"
77
+
78
+ # if nmap directory was set, remove the installed nmap
79
+ if [ ! "${TMP_NMAP_DIR}" = "" ]
80
+ then
81
+ rm -Rf "${TMP_NMAP_DIR}"
82
+ fi
83
+
84
+ # and also delete the archive that we downloaded
85
+ if [ ! "${TMP_NMAP_ARCHIVE}" = "" ] && [ -f "/tmp/${TMP_NMAP_ARCHIVE}" ]
86
+ then
87
+ rm -f "/tmp/${TMP_NMAP_ARCHIVE}"
88
+ fi
89
+ fi
90
+
91
+ if [ ${TMP_NMAP_LIGHT_EXIT_CODE} -eq 0 ] && [ ${TMP_NMAP_THOROUGH_EXIT_CODE} -eq 0 ]
92
+ then
93
+ #both nmaps finished with exit code 0, script suceeded
94
+ ! false
95
+ else
96
+ false
97
+ fi
@@ -0,0 +1,28 @@
1
+ ID: LOGGED_USERS
2
+ Name: List logged-in users
3
+ Depends: [HAS_AWK, HAS_WHO, HAS_BASE]
4
+ Imports: [AWK, WHO, SED]
5
+ Description: List all users that are currently logged in using who.
6
+ Script: |
7
+ IFS=$( printf "\n+" ); IFS=${IFS%+}
8
+ TMP_OUTPUT=$( ${WHO} -u -p )
9
+
10
+ for TMP_LINE in ${TMP_OUTPUT}
11
+ do
12
+ TMP_USER=$( echo ${TMP_LINE} | ${AWK} '{ print $1 }' )
13
+ TMP_TERMINAL=$( echo ${TMP_LINE} | ${AWK} '{ print $2 }' )
14
+ TMP_DATE=$( echo ${TMP_LINE} | ${AWK} '{ print $3 }' )
15
+ TMP_TIME=$( echo ${TMP_LINE} | ${AWK} '{ print $4 }' )
16
+ TMP_IDLE=$( echo ${TMP_LINE} | ${AWK} '{ print $5 }' )
17
+ TMP_PID=$( echo ${TMP_LINE} | ${AWK} '{ print $6 }' )
18
+ TMP_COMMENT=$( echo ${TMP_LINE} | ${AWK} '{ print $7 }' )
19
+
20
+
21
+ script_data "logins.who.${TMP_USER}.line.{${TMP_TERMINAL}}.login_date" "${TMP_DATE}"
22
+ script_data "logins.who.${TMP_USER}.line.{${TMP_TERMINAL}}.login_time" "${TMP_TIME}"
23
+ script_data "logins.who.${TMP_USER}.line.{${TMP_TERMINAL}}.idle" "${TMP_IDLE}"
24
+ script_data "logins.who.${TMP_USER}.line.{${TMP_TERMINAL}}.pid" "${TMP_PID}"
25
+ script_data "logins.who.${TMP_USER}.line.{${TMP_TERMINAL}}.comment" "${TMP_COMMENT}"
26
+ done
27
+ ! false
28
+
@@ -0,0 +1,9 @@
1
+ ID: LYNIS_AUTH
2
+ Children:
3
+ - LYNIS_AUTH_9204
4
+ - LYNIS_AUTH_9208
5
+ - LYNIS_AUTH_9216
6
+ - LYNIS_AUTH_9222
7
+ - LYNIS_AUTH_9226
8
+ - LYNIS_AUTH_9228
9
+ - LYNIS_AUTH_9252
@@ -0,0 +1,43 @@
1
+ ID: LYNIS_AUTH_9204
2
+ Name: Check users with UID zero (0)
3
+ Depends: [FIND_PASSWD_FILE, HAS_GREP]
4
+ Exports: [GROUPS]
5
+ Imports: [HEAD, SED]
6
+ Description: >
7
+ Check that there is only one user with UID 0. Only the 'root' account
8
+ should have this UID, as you are able to do everything you want on a
9
+ system if you have UID 0. If you want to allow multiple accounts to
10
+ administrate your machine, consider using sudo.
11
+ Script: |
12
+ TMP_COUNTER=1
13
+ for TMP_LINE in $(${GREP} -E "^[^:]*:[^:]*:0:" "${PASSWD_FILE}" )
14
+ do
15
+ TMP_USER=$(echo ${TMP_LINE} | ${CUT} -d: -f1)
16
+ TMP_UID=$(echo ${TMP_LINE} | ${CUT} -d: -f3)
17
+ TMP_GID=$(echo ${TMP_LINE} | ${CUT} -d: -f4)
18
+
19
+ script_info_message "User ${TMP_USER} [${TMP_UID}] has root rights"
20
+
21
+ if [ ! "${TMP_USER}" = "root" ]
22
+ then
23
+ script_data "errors.users.duplicate_root.${TMP_COUNTER}.name" "${TMP_USER}"
24
+ script_data "errors.users.duplicate_root.${TMP_COUNTER}.uid" "${TMP_UID}"
25
+ script_data "errors.users.duplicate_root.${TMP_COUNTER}.gid" "${TMP_GID}"
26
+ fi
27
+
28
+ TMP_COUNTER=$(( ${TMP_COUNTER} + 1 ))
29
+ done
30
+
31
+ if [ ${TMP_COUNTER} = 1 ]
32
+ then
33
+ script_error_message "No administrator accounts found"
34
+ false
35
+ elif [ ${TMP_COUNTER} = 2 ]
36
+ then
37
+ script_info_message "No accounts found with UID 0 other than root"
38
+ ! false
39
+ else
40
+ script_error_message "Multiple users with UID 0 found in passwd file"
41
+ false
42
+ fi
43
+
@@ -0,0 +1,35 @@
1
+ ID: LYNIS_AUTH_9208
2
+ Name: Check non unique user ids
3
+ Depends: [FIND_PASSWD_FILE, HAS_GREP, HAS_CUT, HAS_CAT]
4
+ Imports: [PASSWD_FILE, GREP, CUT, CAT]
5
+ Description: >
6
+ Check that each user has a unique UID. Having several
7
+ accounts with the same UID is not meaningful. as only the
8
+ UID is ised internally to distinguish between users.
9
+ Script: |
10
+ TMP_RESULT=""
11
+
12
+ TMP_DUPLICATE_UIDS=$( ${GREP} -v "^$" "${PASSWD_FILE}" | ${SED} -e 's/^[^:]*:[^:]*:\([^:]*\):.*$/\1/' | ${SORT} | ${UNIQ} -d )
13
+ IFS=$( printf ' \t\n+' ); IFS=${IFS%+}
14
+ for TMP_UID in $( echo ${TMP_DUPLICATE_UIDS} )
15
+ do
16
+ TMP_USERNAME_NUM=1
17
+ IFS=$( printf '\n+' ); IFS=${IFS%+}
18
+ for TMP_LINE in $(${GREP} -E "^[^:]*:[^:]*:${TMP_UID}:" "${PASSWD_FILE}" )
19
+ do
20
+ TMP_USER=$(echo ${TMP_LINE} | ${CUT} -d: -f1)
21
+ TMP_RESULT="${TMP_RESULT}I"
22
+
23
+ script_error_message "User ${TMP_USER} does not have a unique UID"
24
+
25
+ #TODO: UID is not a unique key here, as there may also be 3 users with the same UID ...
26
+ script_data "errors.users.duplicate_uid.${TMP_UID}.names.${TMP_USERNAME_NUM}" "${TMP_USER}"
27
+
28
+ TMP_USERNAME_NUM=$(( ${TMP_USERNAME_NUM} + 1 ))
29
+ done
30
+ IFS=$( printf ' \t\n+' ); IFS=${IFS%+}
31
+ done
32
+
33
+ # only succeed check if no users with same uid were found
34
+ [ "${TMP_DUPLICATE_UIDS}" = "" ]
35
+
@@ -0,0 +1,24 @@
1
+ ID: LYNIS_AUTH_9216
2
+ Name: Check /etc/group and shadow group files with grpck tool
3
+ Depends: [HAS_SUPERUSER, HAS_GROUPCHECK]
4
+ Imports: [PASSWD_FILE, GREP, CUT, CAT]
5
+ Description: >
6
+ Run grpck program to verify integrity of group
7
+ and gshadow files.
8
+ Script: |
9
+ TMP_GROUPCHECK_RESULT=$(${RUN_AS_SUPERUSER} ${GROUPCHECK})
10
+
11
+ if [ "${TMP_GROUPCHECK_RESULT}" = "" ]
12
+ then
13
+ ! false
14
+ else
15
+ IFS=$( printf '\n+' ); IFS=${IFS%+}
16
+ TMP_COUNTER=1
17
+ for TMP_LINE in $(echo "${TMP_GROUPCHECK_RESULT}")
18
+ do
19
+ script_error_message "grpck reported error: ${TMP_LINE}"
20
+ script_data "errors.users.grpck.${TMP_COUNTER}" "${TMP_LINE}"
21
+ TMP_COUNTER=$(( ${TMP_COUNTER} + 1 ))
22
+ done
23
+ false
24
+ fi
@@ -0,0 +1,25 @@
1
+ ID: LYNIS_AUTH_9222
2
+ Name: Check non unique group names
3
+ Depends: [HAS_GREP, HAS_CUT, HAS_SORT, HAS_UNIQ, FIND_GROUP_FILE, HAS_TR]
4
+ Imports: [GREP, CUT, SORT, UNIQ, GROUP_FILE, TR]
5
+ Severity: low
6
+ Description: >
7
+ Check that each group name is defined only once in /etc/groups.
8
+ If a group name is defined multiple times this does not necessarily
9
+ mean an error, but you should verify that this is intended.
10
+ Script: |
11
+ TMP_DUPLICATE_GIDS=$(${GREP} -v '^$' ${GROUP_FILE} | ${CUT} -d: -f3 | ${SORT} | ${UNIQ} -d)
12
+
13
+ if [ "${TMP_DUPLICATE_GIDS}" = "" ]
14
+ then
15
+ script_info_message "no duplicate group ids"
16
+ ! false
17
+ else
18
+ IFS=$( printf '\n+' ); IFS=${IFS%+}
19
+ for TMP_GID in $(echo ${TMP_DUPLICATE_GIDS})
20
+ do
21
+ TMP_GROUPNAMES=$(${GROUP} -E "^[^:]*:[^:]*:${TMP_GID}:" ${GROUP_FILE} | ${CUT} -d: -f1 | ${SORT} | ${UNIQ} | ${TR} '\n' ' ')
22
+ script_error_message "The group id ${TMP_GID} is defined multiple times for groups: ${TMP_GROUPNAMES}"
23
+ done
24
+ false
25
+ fi
@@ -0,0 +1,24 @@
1
+ ID: LYNIS_AUTH_9226
2
+ Name: Check non unique group names
3
+ Depends: [HAS_GREP, HAS_CUT, HAS_SORT, HAS_UNIQ, FIND_GROUP_FILE]
4
+ Imports: [GREP, CUT, SORT, UNIQ, GROUP_FILE]
5
+ Severity: low
6
+ Description: >
7
+ Check that each group name is defined only once in /etc/groups.
8
+ If a group name is defined multiple times this does not necessarily
9
+ mean an error, but you should verify that this is intended.
10
+ Script: |
11
+ TMP_DUPLICATE_GROUPS=$(${GREP} -v '^$' ${GROUP_FILE} | ${CUT} -d: -f1 | ${SORT} | ${UNIQ} -d)
12
+
13
+ if [ "${TMP_DUPLICATE_GROUPS}" = "" ]
14
+ then
15
+ script_info_message "no duplicate groups"
16
+ ! false
17
+ else
18
+ IFS=$( printf '\n+' ); IFS=${IFS%+}
19
+ for TMP_LINE in $(echo ${TMP_DUPLICATE_GROUPS})
20
+ do
21
+ script_error_message "The group ${TMP_LINE} is defined multiple times in ${GROUP_FILE}"
22
+ done
23
+ false
24
+ fi
@@ -0,0 +1,24 @@
1
+ ID: LYNIS_AUTH_9228
2
+ Name: Check Linux password file consistency pwck tool
3
+ Depends: [HAS_SUPERUSER, HAS_PASSWD_CHECK, HAS_GREP]
4
+ Imports: [RUN_AS_SUPERUSER, PASSWD_CHECK, GREP]
5
+ Description: >
6
+ Run pwck program to verify integrity of passwd and shadow files.
7
+ Script: |
8
+ TMP_PWCHECK_RESULT=$(${RUN_AS_SUPERUSER} ${PASSWD_CHECK})
9
+
10
+ if [ "${TMP_PWCHECK_RESULT}" = "" ]
11
+ then
12
+ script_info_message "Password and shadow file ok"
13
+ ! false
14
+ else
15
+ IFS=$( printf '\n+' ); IFS=${IFS%+}
16
+ TMP_COUNTER=1
17
+ for TMP_LINE in $(echo "${TMP_PWCHECK_RESULT}" | ${GREP} -v "pwck:")
18
+ do
19
+ script_error_message "pwck reported error: ${TMP_LINE}"
20
+ script_data "errors.users.pwck.${TMP_COUNTER}" "${TMP_LINE}"
21
+ TMP_COUNTER=$(( ${TMP_COUNTER} + 1 ))
22
+ done
23
+ false
24
+ fi
@@ -0,0 +1,19 @@
1
+ ID: LYNIS_AUTH_9252
2
+ Name: Check for sudoers file permissions
3
+ Depends: [HAS_STAT, FIND_SUDOERS_FILE]
4
+ Imports: [STAT, SUDOERS_FILE]
5
+ Severity: low
6
+ Description: >
7
+ Check that each group name is defined only once in /etc/groups.
8
+ If a group name is defined multiple times this does not necessarily
9
+ mean an error, but you should verify that this is intended.
10
+ Script: |
11
+ TMP_PERMS=$( ${STAT} -c '%a' ${SUDOERS_FILE} )
12
+
13
+ if [ "${TMP_PERMS}" = "440" ] || [ "${TMP_PERMS}" = "660" ] || [ "${TMP_PERMS}" = "600" ]
14
+ then
15
+ script_info_message "Sudoers file ${SUDOERS_FILE} permissions ok"
16
+ else
17
+ script_error_message "Permissions (${TMP_PERMS}) of ${SUDOERS_FILE} may be too loose"
18
+ false
19
+ fi
@@ -0,0 +1,17 @@
1
+ ID: MAYBE_HAS_BZIP2
2
+ Name: Check for bzip2
3
+ Depends: [HAS_BASE]
4
+ Exports: [BZIP2]
5
+ Imports: [HEAD, SED]
6
+ Description: Find the bzip2 program and export it to BZIP2.
7
+ Script: |
8
+ if echo "test" | bzip2 --version 2>/dev/null 1>/dev/null
9
+ then
10
+ BZIP2=bzip2
11
+ TMP_BZIP2_NAME=$(echo "test" | ${BZIP2} --version 2>&1 1>/dev/null | ${HEAD} -1 | ${SED} -e 's/^\(.*\) Version \(.*\)$/\1/')
12
+ TMP_BZIP2_VERSION=$(echo "test" | ${BZIP2} --version 2>&1 1>/dev/null | ${HEAD} -1 | ${SED} -e 's/^\(.*\) Version \(.*\)$/\2/')
13
+ script_program_name "${TMP_BZIP2_NAME}" "${TMP_BZIP2_VERSION}"
14
+ else
15
+ script_message "bzip2 not found"
16
+ fi
17
+ ! false
@@ -0,0 +1,17 @@
1
+ ID: MAYBE_HAS_CURL
2
+ Name: Check for curl program
3
+ Depends: [HAS_BASE]
4
+ Imports: [HEAD, SED]
5
+ Description: Find the curl program and export it to CURL, but do not fail if it is not installed.
6
+ Script: |
7
+ if curl --version 2>/dev/null 1>/dev/null
8
+ then
9
+ CURL=curl
10
+ TMP_CURL_NAME=$(${CURL} --version | ${HEAD} -1 | ${SED} -e 's/\([A-Za-z ]\+\)[[:blank:]]\([0-9.]\+\)[[:blank:]].*$/\1/')
11
+ TMP_CURL_VERSION=$(${CURL} --version | ${HEAD} -1 | ${SED} -e 's/\([A-Za-z() ]\+\)[[:blank:]]\([0-9.]\+\)[[:blank:]].*$/\2/')
12
+ script_program_name "${TMP_CURL_NAME}" "${TMP_CURL_VERSION}"
13
+ else
14
+ CURL=""
15
+ script_error_message "not found"
16
+ fi
17
+ ! false
@@ -0,0 +1,17 @@
1
+ ID: MAYBE_HAS_DU
2
+ Name: Check for du program
3
+ Depends: [HAS_BASE]
4
+ Imports: [HEAD, SED]
5
+ Description: Find the du program and export it to DU.
6
+ Script: |
7
+ if du --version 2>/dev/null 1>/dev/null
8
+ then
9
+ DU=du
10
+ TMP_DU_NAME=$(${DU} --version | ${HEAD} -1 | ${SED} -e 's/\([A-Za-z() ]\+\)[[:blank:]]\([0-9.]\+\)/\1/')
11
+ TMP_DU_VERSION=$(${DU} --version | ${HEAD} -1 | ${SED} -e 's/\([A-Za-z() ]\+\)[[:blank:]]\([0-9.]\+\)/\2/')
12
+ script_program_name "${TMP_DU_NAME}" "${TMP_DU_VERSION}"
13
+ else
14
+ DU=""
15
+ script_error_message "du not found"
16
+ fi
17
+ ! false
@@ -0,0 +1,17 @@
1
+ ID: MAYBE_HAS_HOSTNAME
2
+ Name: Check for hostname program
3
+ Depends: [HAS_BASE]
4
+ Imports: [HEAD, SED]
5
+ Description: Find the hostname program and export it to HOSTNAME, but do not fail if it is not installed.
6
+ Script: |
7
+ if hostname --version 2>/dev/null 1>/dev/null
8
+ then
9
+ HOSTNAME=hostname
10
+ TMP_HOSTNAME_NAME=$(${HOSTNAME} --version | ${HEAD} -1 | ${SED} -e 's/\([A-Za-z() ]\+\)[[:blank:]]\([0-9.]\+\)/\1/')
11
+ TMP_HOSTNAME_VERSION=$(${HOSTNAME} --version | ${HEAD} -1 | ${SED} -e 's/\([A-Za-z() ]\+\)[[:blank:]]\([0-9.]\+\)/\2/')
12
+ script_program_name "${TMP_HOSTNAME_NAME}" "${TMP_HOSTNAME_VERSION}"
13
+ else
14
+ HOSTNAME=""
15
+ script_error_message "not found"
16
+ fi
17
+ ! false
@@ -0,0 +1,17 @@
1
+ ID: MAYBE_HAS_ID
2
+ Name: Check for id program
3
+ Depends: [HAS_BASE]
4
+ Imports: [HEAD, SED]
5
+ Description: Find the id program and export it to ID, but do not fail if it is not installed.
6
+ Script: |
7
+ if id --version 2>/dev/null 1>/dev/null
8
+ then
9
+ ID=id
10
+ TMP_ID_NAME=$(${ID} --version | ${HEAD} -1 | ${SED} -e 's/\([A-Za-z() ]\+\)[[:blank:]]\([0-9.]\+\)/\1/')
11
+ TMP_ID_VERSION=$(${ID} --version | ${HEAD} -1 | ${SED} -e 's/\([A-Za-z() ]\+\)[[:blank:]]\([0-9.]\+\)/\2/')
12
+ script_program_name "${TMP_ID_NAME}" "${TMP_ID_VERSION}"
13
+ else
14
+ ID=""
15
+ script_error_message "not found"
16
+ fi
17
+ ! false
@@ -0,0 +1,15 @@
1
+ ID: MAYBE_HAS_LSB_RELEASE
2
+ Name: Check for lsb_release program
3
+ Depends: [HAS_BASE]
4
+ Imports: [HEAD, SED]
5
+ Description: Find the lsb_release program and export it to LSB_RELEASE.
6
+ Script: |
7
+ lsb_release 2>/dev/null 1>/dev/null
8
+ if ! [ "$?" = 127 ]
9
+ then
10
+ LSB_RELEASE="lsb_release -s"
11
+ script_program_name "lsb_release" "unknown"
12
+ else
13
+ script_warn_message "lsb_release not found"
14
+ fi
15
+ ! false