איסוף יומנים של Linux Audit Daemon
במאמר הזה מוסבר איך להטמיע יומנים של Linux Audit Daemon (auditd) ב-Google Security Operations באמצעות Bindplane.
הדימון (daemon) של הביקורת ב-Linux הוא רכיב מרחב המשתמשים של מערכת הביקורת ב-Linux. הוא מתעד אירועים שקשורים לאבטחה במערכת, כולל גישה לקבצים, קריאות למערכת, אירועי אימות ודחיות של SELinux. יומני Auditd חיוניים למעקב אחרי תאימות, לזיהוי פריצות ולניתוח משפטי במארחי Linux.
לפני שמתחילים
חשוב לוודא שמתקיימות הדרישות המוקדמות הבאות:
- מכונה של Google SecOps.
- Windows Server 2016 ואילך, או מארח Linux עם
systemd. - אם מריצים את הסוכן מאחורי שרת proxy, צריך לוודא שהיציאות של חומת האש פתוחות בהתאם לדרישות של סוכן Bindplane.
- גישת Root או sudo במארח Linux שבו פועל auditd.
- חבילת
auditdמותקנת ופועלת במארח Linux של המקור. - החבילה
audispd-pluginsשמותקנת במארח המקור של Linux (מספקת את הפלאגיןaudisp-syslog).
קבלת קובץ אימות להטמעת נתונים ב-Google SecOps
- נכנסים למסוף Google SecOps.
- עוברים אל SIEM Settings > Collection Agents.
- מורידים את קובץ האימות להטמעת נתונים. שומרים את הקובץ באופן מאובטח במערכת שבה יותקן Bindplane.
איך מוצאים את מספר הלקוח ב-Google SecOps
- נכנסים למסוף Google SecOps.
- עוברים אל SIEM Settings > Profile.
- מעתיקים את מזהה הלקוח מהקטע פרטי הארגון ושומרים אותו.
התקנת הסוכן של Bindplane
מתקינים את סוכן Bindplane במערכת ההפעלה Windows או Linux לפי ההוראות הבאות.
התקנת חלונות
- פותחים את שורת הפקודה או את PowerShell כאדמין.
מריצים את הפקודה הבאה:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
התקנה ב-Linux
- פותחים טרמינל עם הרשאות root או sudo.
מריצים את הפקודה הבאה:
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
מקורות מידע נוספים להתקנה
אפשרויות התקנה נוספות זמינות במדריך להתקנת סוכן Bindplane.
הגדרה של סוכן Bindplane לקליטת syslog ושליחה ל-Google SecOps
ניגשים לקובץ התצורה:
- Linux:
/status observiq-otel-collector/config.yaml - Windows:
C:\Program Files\observIQ OpenTelemetry Collector\config.yaml
- Linux:
עורכים את הקובץ
config.yamlבאופן הבא:receivers: udplog: # Replace the port and IP address as required listen_address: "0.0.0.0:514" exporters: chronicle/chronicle_w_labels: compression: gzip # Adjust the path to the credentials file you downloaded in Step 1 creds_file_path: '/path/to/ingestion-authentication-file.json' # Replace with your actual customer ID from Step 2 customer_id: '<your_customer_id>' endpoint: malachiteingestion-pa.googleapis.com # Add optional ingestion labels for better organization log_type: 'AUDITD' raw_log_field: body ingestion_labels: service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - udplog exporters: - chronicle/chronicle_w_labels
- מחליפים את היציאה ואת כתובת ה-IP לפי הצורך בתשתית שלכם.
- מחליפים את
<your_customer_id>במספר הלקוח בפועל. - מעדכנים את
/path/to/ingestion-authentication-file.jsonלנתיב הקובץ שבו נשמר קובץ האימות בשלב קבלת קובץ אימות להעלאת נתונים.
מפעילים מחדש את הסוכן של Bindplane כדי להחיל את השינויים.
כדי להפעיל מחדש את סוכן Bindplane ב-Linux:
מריצים את הפקודה הבאה:
sudo systemctl restart observiq-otel-collectorמוודאים שהשירות פועל:
sudo systemctl status observiq-otel-collectorבודקים אם יש שגיאות ביומנים:
sudo journalctl -u observiq-otel-collector -f
כדי להפעיל מחדש את סוכן Bindplane ב-Windows:
בוחרים אחת מהאפשרויות האלה:
- שורת הפקודה או PowerShell כאדמין:
net stop observiq-otel-collector && net start observiq-otel-collector- מסוף השירותים:
- לוחצים על
Win+R, מקלידיםservices.mscולוחצים על Enter. - מאתרים את observIQ OpenTelemetry Collector.
- לוחצים לחיצה ימנית ובוחרים באפשרות הפעלה מחדש.
- לוחצים על
מוודאים שהשירות פועל:
sc query observiq-otel-collectorבודקים אם יש שגיאות ביומנים:
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
הגדרה של auditd להעברת יומנים באמצעות syslog
התוסף audisp syslog מעביר אירועי ביקורת ל-syslog, ששולח אותם לסוכן Bindplane. זו השיטה המומלצת להעברת יומני auditd.
התקנת הפלאגין audisp syslog
- נכנסים למארח Linux שבו פועל auditd עם הרשאות root או sudo.
מתקינים את החבילה
audispd-plugins:- RHEL/CentOS/Fedora:
sudo yum install audispd-plugins- Debian/Ubuntu:
sudo apt install audispd-plugins
הגדרת הפלאגין syslog
עורכים את קובץ התצורה של הפלאגין syslog:
sudo nano /etc/audit/plugins.d/syslog.confמגדירים את הערכים הבאים בקובץ:
active = yes direction = out path = /sbin/audisp-syslog type = always args = LOG_LOCAL6 format = string- active: מגדירים את הערך
yesכדי להפעיל את הפלאגין. - path: הנתיב לקובץ הבינארי של
audisp-syslog. - type: צריך להגדיר את הערך
alwaysכדי להריץ את הפלאגין כתוכנה חיצונית. - args: מתקן syslog לשימוש.
LOG_LOCAL6מומלץ להפריד בין יומני ביקורת לבין הודעות אחרות של syslog. - format: צריך להגדיר את הערך
stringכדי להעביר אירועים בפורמט טקסט שמתאים ל-syslog.
- active: מגדירים את הערך
הגדרת כללי ביקורת (אופציונלי)
עורכים את קובץ כללי הביקורת כדי להגדיר אילו אירועים לתעד:
sudo nano /etc/audit/rules.d/audit.rulesמוסיפים כללים בהתאם לדרישות המעקב. לדוגמה:
## Delete all existing rules -D ## Set buffer size (increase for high-volume systems) -b 8192 ## Set failure mode (1 = printk, 2 = panic) -f 1 ## Monitor authentication-related files -w /etc/passwd -p wa -k identity -w /etc/group -p wa -k identity -w /etc/shadow -p wa -k identity -w /etc/sudoers -p wa -k sudoers ## Monitor login events -w /var/log/faillog -p wa -k logins -w /var/log/lastlog -p wa -k logins ## Monitor process execution -a always,exit -F arch=b64 -S execve -k exec ## Monitor network configuration changes -a always,exit -F arch=b64 -S sethostname -S setdomainname -k network ## Make the configuration immutable (must be the last rule) -e 2טוענים את כללי הביקורת החדשים:
sudo augenrules --load
הפעלה מחדש של auditd
מפעילים מחדש את שירות auditd כדי להחיל את השינויים בפלאגין ובכללים:
sudo service auditd restart
הגדרת rsyslog להעברת יומני ביקורת ל-Bindplane
יוצרים קובץ תצורה חדש של rsyslog להעברת יומני ביקורת:
sudo nano /etc/rsyslog.d/audit-forward.confמוסיפים את השורה הבאה כדי להעביר יומנים באמצעות UDP לסוכן Bindplane:
local6.* @<BINDPLANE_IP>:514מפעילים מחדש את rsyslog כדי שהשינויים ייכנסו לתוקף:
sudo systemctl restart rsyslog
אימות העברת היומנים
במארח המקור של Linux, יוצרים אירוע ביקורת לבדיקה:
sudo auditctl -w /tmp/test_audit -p wa -k test_chronicleכדי להפעיל את הצפייה, לוחצים על הקובץ:
touch /tmp/test_auditבמארח של סוכן Bindplane, מוודאים שהיומנים מתקבלים:
sudo journalctl -u observiq-otel-collector -f
טבלת מיפוי UDM
| שדה ביומן | מיפוי UDM | היגיון |
|---|---|---|
acct |
target.user.userid |
הערך נלקח מהשדה acct. |
addr |
principal.ip |
הערך נלקח מהשדה addr אם הוא כתובת IP תקינה. |
arch |
additional.fields |
התוספת מתבצעת כצמד מפתח/ערך עם המפתח arch. |
auid |
principal.user.userid |
הערך נלקח מהשדה auid. משמש בתור מזהה המשתמש בביקורת. |
comm |
target.process.command_line |
הערך נלקח מהשדה comm. |
cwd |
additional.fields |
נוסף כצמד מפתח/ערך עם המפתח "cwd". |
exe |
target.process.file.full_path |
הערך נלקח מהשדה exe. |
exit |
additional.fields |
הוא מתווסף כצמד מפתח/ערך עם המפתח exit. |
gid |
principal.user.group_identifiers |
הערך נלקח מהשדה gid. |
hostname |
principal.hostname |
הערך נלקח מהשדה hostname. |
key |
security_result.detection_fields |
הערך מתווסף כצמד מפתח/ערך עם המפתח audit_key. |
msg |
metadata.description |
מנותח מהשדה msg. מכיל את הודעת אירוע הביקורת. |
name |
target.file.full_path |
הערך נלקח מהשדה name כשהוא רלוונטי. |
node |
principal.hostname |
הערך נלקח מהשדה node אם השדה hostname לא קיים. |
op |
metadata.product_event_type |
הערך נלקח מהשדה op (סוג הפעולה). |
pid |
principal.process.pid |
הערך נלקח מהשדה pid. |
ppid |
principal.process.parent_process.pid |
הערך נלקח מהשדה ppid. |
res |
security_result.action |
צריך להגדיר את הערך "ALLOW" אם הערך של res הוא "success" או "1". צריך להגדיר את הערך BLOCK אם הערך של res הוא failed או 0. |
ses |
network.session_id |
הערך נלקח מהשדה ses (מזהה הסשן). |
subj |
principal.process.file.full_path |
הערך נלקח מהשדה subj (הקשר הנושא של SELinux). |
syscall |
additional.fields |
התווסף כצמד מפתח/ערך עם המפתח syscall. |
terminal |
additional.fields |
נוסף כצמד מפתח/ערך עם המפתח "terminal". |
type |
metadata.product_event_type |
הערך נלקח מהשדה type (סוג רשומת הביקורת, למשל SYSCALL, USER_LOGIN, EXECVE). |
uid |
principal.user.userid |
הערך נלקח מהשדה uid. |
metadata.event_type |
הערך נגזר מסוג רשומת הביקורת. הערך שמוגדר הוא USER_LOGIN לאירועי התחברות, USER_LOGOUT לאירועי יציאה מהחשבון, PROCESS_LAUNCH לאירועי הפעלה ו-FILE_MODIFICATION לאירועים שקשורים לקבצים. ברירת המחדל היא GENERIC_EVENT. | |
metadata.product_name |
ההגדרה היא auditd. | |
metadata.vendor_name |
מגדירים את האפשרות 'Linux'. | |
home |
event.idm.read_only_udm.additional.fields |
מופה מיומן השינויים |
shell |
event.idm.read_only_udm.additional.fields |
מופה מיומן השינויים |
name |
event.idm.read_only_udm.target.user.userid |
מופה מיומן השינויים |
name |
event.idm.read_only_udm.target.group.group_display_name |
מופה מיומן השינויים |
UID |
event.idm.read_only_udm.target.user.product_object_id |
מופה מיומן השינויים |
GID |
event.idm.read_only_udm.target.user.group_identifiers |
מופה מיומן השינויים |
GID |
event.idm.read_only_udm.target.group.product_object_id |
מופה מיומן השינויים |
key_type |
event.idm.read_only_udm.additional.fields |
מופה מיומן השינויים |
hash |
event.idm.read_only_udm.additional.fields |
מופה מיומן השינויים |
key_fingerprint |
event.idm.read_only_udm.security_result.detection_fields |
מופה מיומן השינויים |
user |
event.idm.read_only_udm.target.user.userid |
מופה מיומן השינויים |
error_detail1 |
event.idm.read_only_udm.security_result.summary |
מופה מיומן השינויים |
service_name |
event.idm.read_only_udm.additional.fields |
מופה מיומן השינויים |
ssh_disconnect_code |
event.idm.read_only_udm.additional.fields |
מופה מיומן השינויים |
labels.bp_csoc |
event.idm.read_only_udm.additional.fields |
מופה מיומן השינויים |
labels.bp_env_id |
event.idm.read_only_udm.additional.fields |
מופה מיומן השינויים |
labels.log.file.name |
event.idm.read_only_udm.additional.fields |
מופה מיומן השינויים |
resource.labels.node_id |
event.idm.read_only_udm.additional.fields |
מופה מיומן השינויים |
intermediary_host |
event.idm.read_only_udm.intermediary.hostname |
מופה מיומן השינויים |
PWD |
event.idm.read_only_udm.target.file.full_path |
מופה מיומן השינויים |
log_details |
event.idm.read_only_udm.additional.fields |
מופה מיומן השינויים |
indicator.SUID |
event.idm.read_only_udm.security_result.detection_fields |
מופה מיומן השינויים |
indicator.UID |
event.idm.read_only_udm.security_result.detection_fields |
מופה מיומן השינויים |
indicator.AUID |
event.idm.read_only_udm.security_result.detection_fields |
מופה מיומן השינויים |
type_crypto_props.msg |
event.idm.read_only_udm.additional.fields |
מופה מיומן השינויים |
usr |
event.idm.read_only_udm.principal.user.userid |
מופה מיומן השינויים |
pi |
event.idm.read_only_udm.principal.process.pid |
מופה מיומן השינויים |
cmnd |
event.idm.read_only_udm.target.process.command_line |
מופה מיומן השינויים |
proctitle_value |
event.idm.read_only_udm.principal.process.file.full_path |
מופה מיומן השינויים |
filename |
event.idm.read_only_udm.principal.process.file.names |
מופה מיומן השינויים |
filepath |
event.idm.read_only_udm.target.file.full_path |
מופה מיומן השינויים |
uid |
event.idm.read_only_udm.principal.user.userid |
מופה מיומן השינויים |
acct |
event.idm.read_only_udm.principal.user.user_display_name |
מופה מיומן השינויים |
exe |
event.idm.read_only_udm.target.process.file.full_path |
מופה מיומן השינויים |
pid |
event.idm.read_only_udm.principal.process.pid |
מופה מיומן השינויים |
auid |
event.idm.read_only_udm.about.user.userid |
מופה מיומן השינויים |
ses |
event.idm.read_only_udm.network.session_id |
מופה מיומן השינויים |
addr |
event.idm.read_only_udm.principal.ip וגם event.idm.read_only_udm.principal.asset.ip |
מופה מיומן השינויים |
subj |
event.idm.read_only_udm.additional.fields |
מופה מיומן השינויים |
res |
event.idm.read_only_udm.security_result.summary |
מופה מיומן השינויים |
op |
event.idm.read_only_udm.security_result.summary |
מופה מיומן השינויים |
msg_value |
event.idm.read_only_udm.security_result.detection_fields |
מופה מיומן השינויים |
grantors_value |
event.idm.read_only_udm.security_result.detection_fields |
מופה מיומן השינויים |
indicator.msg |
event.idm.read_only_udm.security_result.detection_fields |
מופה מיומן השינויים |
indicator.grantors |
event.idm.read_only_udm.security_result.detection_fields |
מופה מיומן השינויים |
terminal |
event.idm.read_only_udm.principal.application |
מופה מיומן השינויים |
sec_result |
event.idm.read_only_udm.security_result |
מופה מיומן השינויים |
hostname |
event.idm.read_only_udm.principal.hostname |
מופה מיומן השינויים |
indicator.mode |
event.idm.read_only_udm.src.user.attribute.permissions |
מופה מיומן השינויים |
indicator.nametype |
event.idm.read_only_udm.security_result.rule_name |
מופה מיומן השינויים |
indicator.cap_frootid |
event.idm.read_only_udm.security_result.detection_fields |
מופה מיומן השינויים |
indicator.cap_fver |
event.idm.read_only_udm.security_result.detection_fields |
מופה מיומן השינויים |
indicator.cap_fi |
event.idm.read_only_udm.security_result.detection_fields |
מופה מיומן השינויים |
indicator.cap_fp |
event.idm.read_only_udm.security_result.detection_fields |
מופה מיומן השינויים |
indicator.cap_fe |
event.idm.read_only_udm.security_result.detection_fields |
מופה מיומן השינויים |
OUID |
event.idm.read_only_udm.principal.user.userid |
מופה מיומן השינויים |
OGID |
event.idm.read_only_udm.principal.group.group_display_name |
מופה מיומן השינויים |
action_data |
event.idm.read_only_udm.security_result.action_details |
מופה מיומן השינויים |
target_email |
event.idm.ready_only_udm.target.user.email_addresses |
מופה מיומן השינויים |
target_port |
event.idm.ready_only_udm.target.port |
מופה מיומן השינויים |
status |
event.idm.ready_only_udm.security_result.action_details |
מופה מיומן השינויים |
to_email |
event.idm.ready_only_udm.network.email.to |
מופה מיומן השינויים |
target_hostname |
event.idm.ready_only_udm.target.hostname |
מופה מיומן השינויים |
"relay_data" |
event.idm.ready_only_udm.additional.fields |
מופה מיומן השינויים |
"delays_data" |
event.idm.ready_only_udm.additional.fields |
מופה מיומן השינויים |
"delay_data" |
event.idm.ready_only_udm.additional.fields |
מופה מיומן השינויים |
and "dns_data" |
event.idm.ready_only_udm.additional.fields |
מופה מיומן השינויים |
bytes_sent |
event.idm.ready_only_udm.network.sent_bytes |
מופה מיומן השינויים |
bytes_received |
event.idm.ready_only_udm.network.received_bytes |
מופה מיומן השינויים |
response_code |
event.idm.ready_only_udm.network.http.response_code |
מופה מיומן השינויים |
principal_user_name |
principal.user.userid |
מופה מיומן השינויים |
remote |
principal.ip |
מופה מיומן השינויים |
method |
network.http.method |
מופה מיומן השינויים |
path |
principal.file.full_path |
מופה מיומן השינויים |
code |
additional.fields |
מופה מיומן השינויים |
size |
principal.file.size |
מופה מיומן השינויים |
agent |
network.http.user_agent |
מופה מיומן השינויים |
az |
principal.location.name |
מופה מיומן השינויים |
ec2_instance_id |
principal.asset.product_object_id |
מופה מיומן השינויים |
private_ip |
principal.ip |
מופה מיומן השינויים |
ProviderName |
additional.fields |
מופה מיומן השינויים |
Version |
additional.fields |
מופה מיומן השינויים |
Task |
additional.fields |
מופה מיומן השינויים |
EventRecordID |
additional.fields |
מופה מיומן השינויים |
ThreadID |
additional.fields |
מופה מיומן השינויים |
messageType |
target.resource.attribute.labels |
מופה מיומן השינויים |
owner |
principal.user.userid |
מופה מיומן השינויים |
logevent.id |
metadata.product_log_id |
מופה מיומן השינויים |
logGroup |
secu_result.about.resource.name |
מופה מיומן השינויים |
logStream |
secu_result.about.resource.attribute.labels |
מופה מיומן השינויים |
ip_addr |
principal.ip |
מופה מיומן השינויים |
gd |
secu_result.description |
מופה מיומן השינויים |
process |
target.application |
מופה מיומן השינויים |
pid |
target.process.pid |
מופה מיומן השינויים |
status_code |
network.http.response_code |
מופה מיומן השינויים |
url |
network.http.referral_url |
מופה מיומן השינויים |
useragent |
network.http.user_agent |
מופה מיומן השינויים |
request |
additional.fields |
מופה מיומן השינויים |
tls_version |
network.tls.version |
מופה מיומן השינויים |
hostname_is |
principal.hostname |
מופה מיומן השינויים |
referrer |
network.http.referral_url |
מופה מיומן השינויים |
metadata.event_type |
USER_LOGIN |
מופה מיומן השינויים |
metadata.event_type |
PROCESS_UNCATEGORIZED |
מופה מיומן השינויים |
srcIP |
principal.ip |
מופה מיומן השינויים |
username |
principal.user.user_display_name |
מופה מיומן השינויים |
type_syscall_props.msg |
additional.fields |
מופה מיומן השינויים |
sw", "sw_type", and "subj |
security_result.detection_fields |
מופה מיומן השינויים |
indicator.SYSCALL |
security_result.detection_fields |
מופה מיומן השינויים |
exe |
principal.process.file.full_path |
מופה מיומן השינויים |
target.user.userid |
principal.user.userid |
מופה מיומן השינויים |
target_user_name |
target.user.userid |
מופה מיומן השינויים |
field |
field33 |
מופה מיומן השינויים |
fp |
network.tls.client.certificate.sha256 |
מופה מיומן השינויים |
pid |
principal.process.pid |
מופה מיומן השינויים |
syslog-tag |
security_result.detection_fields |
מופה מיומן השינויים |
inter_ip |
intermediary.ip |
מופה מיומן השינויים |
inter_hostname |
intermediary.hostname |
מופה מיומן השינויים |
grp |
target.group.group_display_name |
מופה מיומן השינויים |
id |
about.user.userid |
מופה מיומן השינויים |
acct |
target.user.user_display_name |
מופה מיומן השינויים |
uid |
principal.user.userid |
מופה מיומן השינויים |
auid |
about.user.userid |
מופה מיומן השינויים |
auid |
target.user.userid |
מופה מיומן השינויים |
op" and "id |
security_result.summary |
מופה מיומן השינויים |
op" and "acct |
security_result.summary |
מופה מיומן השינויים |
labels.compute.googleapis.com/resource_name","jsonPayload._HOSTNAME" , "CollectorHostName", "HOSTNAME", and "Computer |
principal.hostname |
מופה מיומן השינויים |
HostIP |
principal.ip |
מופה מיומן השינויים |
ProcessID" and "jsonPayload._PID |
principal.process.pid |
מופה מיומן השינויים |
SyslogMessage |
metadata.description |
מופה מיומן השינויים |
TenantId", "_ItemId", "_Internal_WorkspaceResourceId", "_ResourceId", and "Facility |
additional.fields |
מופה מיומן השינויים |
SeverityLevel |
security_result.severity |
מופה מיומן השינויים |
SourceSystem |
principal.platform |
מופה מיומן השינויים |
jsonPayload._COMM |
principal.application |
מופה מיומן השינויים |
jsonPayload._EXE |
target.process.file.full_path |
מופה מיומן השינויים |
jsonPayload._AUDIT_FIELD_FILE |
target.file.full_path |
מופה מיומן השינויים |
jsonPayload._AUDIT_FIELD_HASH |
target.file.hash |
מופה מיומן השינויים |
jsonPayload._AUDIT_SESSION |
network.session_id |
מופה מיומן השינויים |
jsonPayload._PPID |
principal.process.parent_process.pid |
מופה מיומן השינויים |
jsonPayload._AUDIT_FIELD_A0", "jsonPayload._AUDIT_FIELD_A1", "jsonPayload._AUDIT_FIELD_A2", "jsonPayload._AUDIT_FIELD_A3", "jsonPayload._BOOT_ID", and "jsonPayload._AUDIT_FIELD_EXIT |
security_result.detection_fields |
מופה מיומן השינויים |
id |
target.user.userid |
מופה מיומן השינויים |
ID |
target.user.user_display_name |
מופה מיומן השינויים |
user_name |
principal.user.userid |
מופה מיומן השינויים |
principal_user_userid |
principal.user.userid |
מופה מיומן השינויים |
vendor_name |
Linux |
מופה מיומן השינויים |
product_name |
AuditD |
מופה מיומן השינויים |
ip |
target.ip |
מופה מיומן השינויים |
success |
security_result.summary |
מופה מיומן השינויים |
syscall", "exit", "tty", "a0", "a1", "a2", "a3 |
security_result.about.labels |
מופה מיומן השינויים |
יומן שינויים
צפייה ביומן השינויים של כלי הניתוח הזה
הבעיה עדיין לא נפתרה? קבלת תשובות מחברי הקהילה וממומחי Google SecOps.