Fix Ansible remediation for sshd rules#14655
Merged
Mab879 merged 1 commit intoComplianceAsCode:masterfrom Apr 17, 2026
Merged
Conversation
|
This datastream diff is auto generated by the check Click here to see the full diffansible remediation for rule 'xccdf_org.ssgproject.content_rule_rsyslog_cron_logging' differs.
--- xccdf_org.ssgproject.content_rule_rsyslog_cron_logging
+++ xccdf_org.ssgproject.content_rule_rsyslog_cron_logging
@@ -127,34 +127,79 @@
- rsyslog_cron_logging
- name: Ensure cron Is Logging To Rsyslog - Check if the parameter cron.* is configured
+ in /etc/rsyslog.conf
+ ansible.builtin.lineinfile:
+ path: /etc/rsyslog.conf
+ regexp: ^\s*{{ "cron.*"| regex_escape }}
+ state: absent
+ check_mode: true
+ changed_when: false
+ register: _config_file_has_parameter
+ when:
+ - '"kernel-core" in ansible_facts.packages'
+ - '"rsyslog" in ansible_facts.packages'
+ tags:
+ - CCE-80859-2
+ - DISA-STIG-RHEL-08-030010
+ - NIST-800-53-CM-6(a)
+ - configure_strategy
+ - low_complexity
+ - low_disruption
+ - medium_severity
+ - no_reboot_needed
+ - rsyslog_cron_logging
+
+- name: Ensure cron Is Logging To Rsyslog - Check if the parameter cron.* is configured
+ in /etc/rsyslog.d
ansible.builtin.find:
paths:
- - /etc/rsyslog.conf
- /etc/rsyslog.d
contains: ^\s*{{ "cron.*"| regex_escape }}
- register: _sshd_config_has_parameter
- when:
- - '"kernel-core" in ansible_facts.packages'
- - '"rsyslog" in ansible_facts.packages'
- tags:
- - CCE-80859-2
- - DISA-STIG-RHEL-08-030010
- - NIST-800-53-CM-6(a)
- - configure_strategy
- - low_complexity
- - low_disruption
- - medium_severity
- - no_reboot_needed
- - rsyslog_cron_logging
-
-- name: Ensure cron Is Logging To Rsyslog - Check if the parameter cron.* is configured
- correctly
+ register: _config_dir_has_parameter
+ when:
+ - '"kernel-core" in ansible_facts.packages'
+ - '"rsyslog" in ansible_facts.packages'
+ tags:
+ - CCE-80859-2
+ - DISA-STIG-RHEL-08-030010
+ - NIST-800-53-CM-6(a)
+ - configure_strategy
+ - low_complexity
+ - low_disruption
+ - medium_severity
+ - no_reboot_needed
+ - rsyslog_cron_logging
+
+- name: Ensure cron Is Logging To Rsyslog - Check if the parameter cron.* is configured
+ correctly in /etc/rsyslog.conf
+ ansible.builtin.lineinfile:
+ path: /etc/rsyslog.conf
+ regexp: ^\s*{{ "cron.*"| regex_escape }}/var/log/cron$
+ state: absent
+ check_mode: true
+ changed_when: false
+ register: _config_file_correctly
+ when:
+ - '"kernel-core" in ansible_facts.packages'
+ - '"rsyslog" in ansible_facts.packages'
+ tags:
+ - CCE-80859-2
+ - DISA-STIG-RHEL-08-030010
+ - NIST-800-53-CM-6(a)
+ - configure_strategy
+ - low_complexity
+ - low_disruption
+ - medium_severity
+ - no_reboot_needed
+ - rsyslog_cron_logging
+
+- name: Ensure cron Is Logging To Rsyslog - Check if the parameter cron.* is configured
+ correctly in /etc/rsyslog.d
ansible.builtin.find:
paths:
- - /etc/rsyslog.conf
- /etc/rsyslog.d
contains: ^\s*{{ "cron.*"| regex_escape }}/var/log/cron$
- register: _sshd_config_correctly
+ register: _config_dir_correctly
when:
- '"kernel-core" in ansible_facts.packages'
- '"rsyslog" in ansible_facts.packages'
@@ -199,7 +244,7 @@
create: false
regexp: (?i)^\s*{{ "cron.*"| regex_escape }}
state: absent
- with_items: '{{ _etc_rsyslog_d_has_parameter.files }}'
+ with_items: '{{ _etc_rsyslog_d_has_parameter.files | default([]) }}'
when: _etc_rsyslog_d_has_parameter.matched > 0
- name: Insert correct line to /etc/rsyslog.d/cron.conf
@@ -212,7 +257,9 @@
when:
- '"kernel-core" in ansible_facts.packages'
- '"rsyslog" in ansible_facts.packages'
- - _sshd_config_correctly.matched == 0 or _sshd_config_has_parameter.matched != 1
+ - (_config_file_correctly.found == 0 and _config_dir_correctly.matched == 0) or
+ ((_config_file_has_parameter.found | int) + (_config_dir_has_parameter.matched
+ | int)) != 1
tags:
- CCE-80859-2
- DISA-STIG-RHEL-08-030010
ansible remediation for rule 'xccdf_org.ssgproject.content_rule_rsyslog_encrypt_offload_actionsendstreamdriverauthmode' differs.
--- xccdf_org.ssgproject.content_rule_rsyslog_encrypt_offload_actionsendstreamdriverauthmode
+++ xccdf_org.ssgproject.content_rule_rsyslog_encrypt_offload_actionsendstreamdriverauthmode
@@ -91,35 +91,79 @@
- rsyslog_encrypt_offload_actionsendstreamdriverauthmode
- name: Ensure Rsyslog Authenticates Off-Loaded Audit Records - Check if the parameter
- $ActionSendStreamDriverAuthMode is configured
+ $ActionSendStreamDriverAuthMode is configured in /etc/rsyslog.conf
+ ansible.builtin.lineinfile:
+ path: /etc/rsyslog.conf
+ regexp: ^\s*{{ "$ActionSendStreamDriverAuthMode"| regex_escape }}\s
+ state: absent
+ check_mode: true
+ changed_when: false
+ register: _config_file_has_parameter
+ when:
+ - '"kernel-core" in ansible_facts.packages'
+ - '"rsyslog" in ansible_facts.packages'
+ tags:
+ - CCE-86339-9
+ - DISA-STIG-RHEL-08-030720
+ - NIST-800-53-AU-4(1)
+ - configure_strategy
+ - low_complexity
+ - low_disruption
+ - medium_severity
+ - no_reboot_needed
+ - rsyslog_encrypt_offload_actionsendstreamdriverauthmode
+
+- name: Ensure Rsyslog Authenticates Off-Loaded Audit Records - Check if the parameter
+ $ActionSendStreamDriverAuthMode is configured in /etc/rsyslog.d
ansible.builtin.find:
paths:
- - /etc/rsyslog.conf
- /etc/rsyslog.d
contains: ^\s*{{ "$ActionSendStreamDriverAuthMode"| regex_escape }}\s
- register: _sshd_config_has_parameter
- when:
- - '"kernel-core" in ansible_facts.packages'
- - '"rsyslog" in ansible_facts.packages'
- tags:
- - CCE-86339-9
- - DISA-STIG-RHEL-08-030720
- - NIST-800-53-AU-4(1)
- - configure_strategy
- - low_complexity
- - low_disruption
- - medium_severity
- - no_reboot_needed
- - rsyslog_encrypt_offload_actionsendstreamdriverauthmode
-
-- name: Ensure Rsyslog Authenticates Off-Loaded Audit Records - Check if the parameter
- $ActionSendStreamDriverAuthMode is configured correctly
+ register: _config_dir_has_parameter
+ when:
+ - '"kernel-core" in ansible_facts.packages'
+ - '"rsyslog" in ansible_facts.packages'
+ tags:
+ - CCE-86339-9
+ - DISA-STIG-RHEL-08-030720
+ - NIST-800-53-AU-4(1)
+ - configure_strategy
+ - low_complexity
+ - low_disruption
+ - medium_severity
+ - no_reboot_needed
+ - rsyslog_encrypt_offload_actionsendstreamdriverauthmode
+
+- name: Ensure Rsyslog Authenticates Off-Loaded Audit Records - Check if the parameter
+ $ActionSendStreamDriverAuthMode is configured correctly in /etc/rsyslog.conf
+ ansible.builtin.lineinfile:
+ path: /etc/rsyslog.conf
+ regexp: ^\s*{{ "$ActionSendStreamDriverAuthMode"| regex_escape }}\sx509/name$
+ state: absent
+ check_mode: true
+ changed_when: false
+ register: _config_file_correctly
+ when:
+ - '"kernel-core" in ansible_facts.packages'
+ - '"rsyslog" in ansible_facts.packages'
+ tags:
+ - CCE-86339-9
+ - DISA-STIG-RHEL-08-030720
+ - NIST-800-53-AU-4(1)
+ - configure_strategy
+ - low_complexity
+ - low_disruption
+ - medium_severity
+ - no_reboot_needed
+ - rsyslog_encrypt_offload_actionsendstreamdriverauthmode
+
+- name: Ensure Rsyslog Authenticates Off-Loaded Audit Records - Check if the parameter
+ $ActionSendStreamDriverAuthMode is configured correctly in /etc/rsyslog.d
ansible.builtin.find:
paths:
- - /etc/rsyslog.conf
- /etc/rsyslog.d
contains: ^\s*{{ "$ActionSendStreamDriverAuthMode"| regex_escape }}\sx509/name$
- register: _sshd_config_correctly
+ register: _config_dir_correctly
when:
- '"kernel-core" in ansible_facts.packages'
- '"rsyslog" in ansible_facts.packages'
@@ -164,7 +208,7 @@
create: false
regexp: (?i)^\s*{{ "$ActionSendStreamDriverAuthMode"| regex_escape }}\s
state: absent
- with_items: '{{ _etc_rsyslog_d_has_parameter.files }}'
+ with_items: '{{ _etc_rsyslog_d_has_parameter.files | default([]) }}'
when: _etc_rsyslog_d_has_parameter.matched > 0
- name: Insert correct line to /etc/rsyslog.conf
@@ -177,14 +221,16 @@
when:
- '"kernel-core" in ansible_facts.packages'
- '"rsyslog" in ansible_facts.packages'
- - _sshd_config_correctly.matched == 0 or _sshd_config_has_parameter.matched != 1
- tags:
- - CCE-86339-9
- - DISA-STIG-RHEL-08-030720
- - NIST-800-53-AU-4(1)
- - configure_strategy
- - low_complexity
- - low_disruption
- - medium_severity
- - no_reboot_needed
- - rsyslog_encrypt_offload_actionsendstreamdriverauthmode
+ - (_config_file_correctly.found == 0 and _config_dir_correctly.matched == 0) or
+ ((_config_file_has_parameter.found | int) + (_config_dir_has_parameter.matched
+ | int)) != 1
+ tags:
+ - CCE-86339-9
+ - DISA-STIG-RHEL-08-030720
+ - NIST-800-53-AU-4(1)
+ - configure_strategy
+ - low_complexity
+ - low_disruption
+ - medium_severity
+ - no_reboot_needed
+ - rsyslog_encrypt_offload_actionsendstreamdriverauthmode
ansible remediation for rule 'xccdf_org.ssgproject.content_rule_rsyslog_encrypt_offload_actionsendstreamdrivermode' differs.
--- xccdf_org.ssgproject.content_rule_rsyslog_encrypt_offload_actionsendstreamdrivermode
+++ xccdf_org.ssgproject.content_rule_rsyslog_encrypt_offload_actionsendstreamdrivermode
@@ -91,35 +91,79 @@
- rsyslog_encrypt_offload_actionsendstreamdrivermode
- name: Ensure Rsyslog Encrypts Off-Loaded Audit Records - Check if the parameter
- $ActionSendStreamDriverMode is configured
+ $ActionSendStreamDriverMode is configured in /etc/rsyslog.conf
+ ansible.builtin.lineinfile:
+ path: /etc/rsyslog.conf
+ regexp: ^\s*{{ "$ActionSendStreamDriverMode"| regex_escape }}
+ state: absent
+ check_mode: true
+ changed_when: false
+ register: _config_file_has_parameter
+ when:
+ - '"kernel-core" in ansible_facts.packages'
+ - '"rsyslog" in ansible_facts.packages'
+ tags:
+ - CCE-86098-1
+ - DISA-STIG-RHEL-08-030710
+ - NIST-800-53-AU-4(1)
+ - configure_strategy
+ - low_complexity
+ - low_disruption
+ - medium_severity
+ - no_reboot_needed
+ - rsyslog_encrypt_offload_actionsendstreamdrivermode
+
+- name: Ensure Rsyslog Encrypts Off-Loaded Audit Records - Check if the parameter
+ $ActionSendStreamDriverMode is configured in /etc/rsyslog.d
ansible.builtin.find:
paths:
- - /etc/rsyslog.conf
- /etc/rsyslog.d
contains: ^\s*{{ "$ActionSendStreamDriverMode"| regex_escape }}
- register: _sshd_config_has_parameter
- when:
- - '"kernel-core" in ansible_facts.packages'
- - '"rsyslog" in ansible_facts.packages'
- tags:
- - CCE-86098-1
- - DISA-STIG-RHEL-08-030710
- - NIST-800-53-AU-4(1)
- - configure_strategy
- - low_complexity
- - low_disruption
- - medium_severity
- - no_reboot_needed
- - rsyslog_encrypt_offload_actionsendstreamdrivermode
-
-- name: Ensure Rsyslog Encrypts Off-Loaded Audit Records - Check if the parameter
- $ActionSendStreamDriverMode is configured correctly
+ register: _config_dir_has_parameter
+ when:
+ - '"kernel-core" in ansible_facts.packages'
+ - '"rsyslog" in ansible_facts.packages'
+ tags:
+ - CCE-86098-1
+ - DISA-STIG-RHEL-08-030710
+ - NIST-800-53-AU-4(1)
+ - configure_strategy
+ - low_complexity
+ - low_disruption
+ - medium_severity
+ - no_reboot_needed
+ - rsyslog_encrypt_offload_actionsendstreamdrivermode
+
+- name: Ensure Rsyslog Encrypts Off-Loaded Audit Records - Check if the parameter
+ $ActionSendStreamDriverMode is configured correctly in /etc/rsyslog.conf
+ ansible.builtin.lineinfile:
+ path: /etc/rsyslog.conf
+ regexp: ^\s*{{ "$ActionSendStreamDriverMode"| regex_escape }} 1$
+ state: absent
+ check_mode: true
+ changed_when: false
+ register: _config_file_correctly
+ when:
+ - '"kernel-core" in ansible_facts.packages'
+ - '"rsyslog" in ansible_facts.packages'
+ tags:
+ - CCE-86098-1
+ - DISA-STIG-RHEL-08-030710
+ - NIST-800-53-AU-4(1)
+ - configure_strategy
+ - low_complexity
+ - low_disruption
+ - medium_severity
+ - no_reboot_needed
+ - rsyslog_encrypt_offload_actionsendstreamdrivermode
+
+- name: Ensure Rsyslog Encrypts Off-Loaded Audit Records - Check if the parameter
+ $ActionSendStreamDriverMode is configured correctly in /etc/rsyslog.d
ansible.builtin.find:
paths:
- - /etc/rsyslog.conf
- /etc/rsyslog.d
contains: ^\s*{{ "$ActionSendStreamDriverMode"| regex_escape }} 1$
- register: _sshd_config_correctly
+ register: _config_dir_correctly
when:
- '"kernel-core" in ansible_facts.packages'
- '"rsyslog" in ansible_facts.packages'
@@ -164,7 +208,7 @@
create: false
regexp: '(?i)^\s*{{ "$ActionSendStreamDriverMode"| regex_escape }} '
state: absent
- with_items: '{{ _etc_rsyslog_d_has_parameter.files }}'
+ with_items: '{{ _etc_rsyslog_d_has_parameter.files | default([]) }}'
when: _etc_rsyslog_d_has_parameter.matched > 0
- name: Insert correct line to /etc/rsyslog.conf
@@ -177,14 +221,16 @@
when:
- '"kernel-core" in ansible_facts.packages'
- '"rsyslog" in ansible_facts.packages'
- - _sshd_config_correctly.matched == 0 or _sshd_config_has_parameter.matched != 1
- tags:
- - CCE-86098-1
- - DISA-STIG-RHEL-08-030710
- - NIST-800-53-AU-4(1)
- - configure_strategy
- - low_complexity
- - low_disruption
- - medium_severity
- - no_reboot_needed
- - rsyslog_encrypt_offload_actionsendstreamdrivermode
+ - (_config_file_correctly.found == 0 and _config_dir_correctly.matched == 0) or
+ ((_config_file_has_parameter.found | int) + (_config_dir_has_parameter.matched
+ | int)) != 1
+ tags:
+ - CCE-86098-1
+ - DISA-STIG-RHEL-08-030710
+ - NIST-800-53-AU-4(1)
+ - configure_strategy
+ - low_complexity
+ - low_disruption
+ - medium_severity
+ - no_reboot_needed
+ - rsyslog_encrypt_offload_actionsendstreamdrivermode
ansible remediation for rule 'xccdf_org.ssgproject.content_rule_rsyslog_encrypt_offload_defaultnetstreamdriver' differs.
--- xccdf_org.ssgproject.content_rule_rsyslog_encrypt_offload_defaultnetstreamdriver
+++ xccdf_org.ssgproject.content_rule_rsyslog_encrypt_offload_defaultnetstreamdriver
@@ -91,35 +91,79 @@
- rsyslog_encrypt_offload_defaultnetstreamdriver
- name: Ensure Rsyslog Encrypts Off-Loaded Audit Records - Check if the parameter
- $DefaultNetstreamDriver is configured
+ $DefaultNetstreamDriver is configured in /etc/rsyslog.conf
+ ansible.builtin.lineinfile:
+ path: /etc/rsyslog.conf
+ regexp: ^\s*{{ "$DefaultNetstreamDriver"| regex_escape }}
+ state: absent
+ check_mode: true
+ changed_when: false
+ register: _config_file_has_parameter
+ when:
+ - '"kernel-core" in ansible_facts.packages'
+ - '"rsyslog" in ansible_facts.packages'
+ tags:
+ - CCE-85992-6
+ - DISA-STIG-RHEL-08-030710
+ - NIST-800-53-AU-4(1)
+ - configure_strategy
+ - low_complexity
+ - low_disruption
+ - medium_severity
+ - no_reboot_needed
+ - rsyslog_encrypt_offload_defaultnetstreamdriver
+
+- name: Ensure Rsyslog Encrypts Off-Loaded Audit Records - Check if the parameter
+ $DefaultNetstreamDriver is configured in /etc/rsyslog.d
ansible.builtin.find:
paths:
- - /etc/rsyslog.conf
- /etc/rsyslog.d
contains: ^\s*{{ "$DefaultNetstreamDriver"| regex_escape }}
- register: _sshd_config_has_parameter
- when:
- - '"kernel-core" in ansible_facts.packages'
- - '"rsyslog" in ansible_facts.packages'
- tags:
- - CCE-85992-6
- - DISA-STIG-RHEL-08-030710
- - NIST-800-53-AU-4(1)
- - configure_strategy
- - low_complexity
- - low_disruption
- - medium_severity
- - no_reboot_needed
- - rsyslog_encrypt_offload_defaultnetstreamdriver
-
-- name: Ensure Rsyslog Encrypts Off-Loaded Audit Records - Check if the parameter
- $DefaultNetstreamDriver is configured correctly
+ register: _config_dir_has_parameter
+ when:
+ - '"kernel-core" in ansible_facts.packages'
+ - '"rsyslog" in ansible_facts.packages'
+ tags:
+ - CCE-85992-6
+ - DISA-STIG-RHEL-08-030710
+ - NIST-800-53-AU-4(1)
+ - configure_strategy
+ - low_complexity
+ - low_disruption
+ - medium_severity
+ - no_reboot_needed
+ - rsyslog_encrypt_offload_defaultnetstreamdriver
+
+- name: Ensure Rsyslog Encrypts Off-Loaded Audit Records - Check if the parameter
+ $DefaultNetstreamDriver is configured correctly in /etc/rsyslog.conf
+ ansible.builtin.lineinfile:
+ path: /etc/rsyslog.conf
+ regexp: ^\s*{{ "$DefaultNetstreamDriver"| regex_escape }} gtls$
+ state: absent
+ check_mode: true
+ changed_when: false
+ register: _config_file_correctly
+ when:
+ - '"kernel-core" in ansible_facts.packages'
+ - '"rsyslog" in ansible_facts.packages'
+ tags:
+ - CCE-85992-6
+ - DISA-STIG-RHEL-08-030710
+ - NIST-800-53-AU-4(1)
+ - configure_strategy
+ - low_complexity
+ - low_disruption
+ - medium_severity
+ - no_reboot_needed
+ - rsyslog_encrypt_offload_defaultnetstreamdriver
+
+- name: Ensure Rsyslog Encrypts Off-Loaded Audit Records - Check if the parameter
+ $DefaultNetstreamDriver is configured correctly in /etc/rsyslog.d
ansible.builtin.find:
paths:
- - /etc/rsyslog.conf
- /etc/rsyslog.d
contains: ^\s*{{ "$DefaultNetstreamDriver"| regex_escape }} gtls$
- register: _sshd_config_correctly
+ register: _config_dir_correctly
when:
- '"kernel-core" in ansible_facts.packages'
- '"rsyslog" in ansible_facts.packages'
@@ -164,7 +208,7 @@
create: false
regexp: '(?i)^\s*{{ "$DefaultNetstreamDriver"| regex_escape }} '
state: absent
- with_items: '{{ _etc_rsyslog_d_has_parameter.files }}'
+ with_items: '{{ _etc_rsyslog_d_has_parameter.files | default([]) }}'
when: _etc_rsyslog_d_has_parameter.matched > 0
- name: Insert correct line to /etc/rsyslog.conf
@@ -177,14 +221,16 @@
when:
- '"kernel-core" in ansible_facts.packages'
- '"rsyslog" in ansible_facts.packages'
- - _sshd_config_correctly.matched == 0 or _sshd_config_has_parameter.matched != 1
- tags:
- - CCE-85992-6
- - DISA-STIG-RHEL-08-030710
- - NIST-800-53-AU-4(1)
- - configure_strategy
- - low_complexity
- - low_disruption
- - medium_severity
- - no_reboot_needed
- - rsyslog_encrypt_offload_defaultnetstreamdriver
+ - (_config_file_correctly.found == 0 and _config_dir_correctly.matched == 0) or
+ ((_config_file_has_parameter.found | int) + (_config_dir_has_parameter.matched
+ | int)) != 1
+ tags:
+ - CCE-85992-6
+ - DISA-STIG-RHEL-08-030710
+ - NIST-800-53-AU-4(1)
+ - configure_strategy
+ - low_complexity
+ - low_disruption
+ - medium_severity
+ - no_reboot_needed
+ - rsyslog_encrypt_offload_defaultnetstreamdriver |
This changes namely rules using the `sshd_lineinfile` template. The problem was that the `ansible.builtin.file` Ansible module accepts only directories as `paths`, it doesn't accept regular files, therefore, the `/etc/ssh/sshd_config` file wasn't checked by this module. Addressing: ``` "/etc/ssh/sshd_config": "'/etc/ssh/sshd_config' is not a directory" ``` Fixes: ComplianceAsCode#14654
d5334df to
27cff44
Compare
|
@jan-cerny: The following test failed, say
Full PR test history. Your PR dashboard. DetailsInstructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. I understand the commands that are listed here. |
Mab879
approved these changes
Apr 17, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This changes namely rules using the
sshd_lineinfiletemplate. The problem was that theansible.builtin.fileAnsible module accepts only directories aspaths, it doesn't accept regular files, therefore, the/etc/ssh/sshd_configfile wasn't checked by this module.Addressing:
Fixes: #14654