데이터베이스 스타일 쿼리를 사용하여 시스템 정보를 쉽게 얻을 수 있습니다.
Linux는 사용자가 호스트 운영 체제에 대한 정보를 수집하는 데 도움이 되는 많은 명령을 제공합니다.
어떤 패키지가 설치되어 있는지, 프로세스가 실행 중인지, 부팅 시 서비스가 시작되는지 조회합니다. 또는 시스템의 하드웨어에 대해 학습합니다.
각 명령은 고유한 출력 형식을 사용하여 이 정보를 나열합니다. 특정 정보를 찾기 위해 결과를 필터링 하려면 grep, sed 및 awk와 같은 도구를 사용해야 합니다. 또한 이 많은 정보가 자주 변경되어 시스템 상태가 변경됩니다.
데이터베이스 SQL 쿼리의 출력과 같은 형식으로 이 모든 정보를 보는 것이 도움이 될 것입니다. 비슷한 이름의 SQL 데이터베이스 테이블을 쿼리하는 것처럼 ps 및 rpm 명령의 출력을 쿼리할 수 있다고 상상해 보십시오.
다행히도 그 이상을 수행하는 도구가 있습니다. Osquery는 오픈 소스 "SQL 기반 운영 체제 계측, 모니터링 및 분석 프레임워크"입니다.
보안, DevOps, 규정 준수 및 인벤토리 관리(몇 가지만 들자면)를 처리하는 많은 애플리케이션은 핵심적으로 Osquery가 제공하는 핵심 기능에 의존합니다.
오스쿼리 설치
Osquery는 Linux, macOS, Windows 및 FreeBSD에서 사용할 수 있습니다. 설치 지침에 따라 운영 체제의 최신 버전을 설치합니다. (이 예제에서는 버전 4.7.0을 사용하겠습니다.)
설치 후 작동하는지 확인합니다.
$ rpm -qa | grep osquery
osquery-4.7.0-1.linux.x86_64
$
$ osqueryi --version
osqueryi version 4.7.0
$
Osquery 구성 요소
Osquery에는 두 가지 주요 구성 요소가 있습니다.
osqueryd 데몬을 실행하지 않고도 osqueri 유틸리티를 실행할 수 있습니다. 다른 유틸리티인 osqueryctl은 데몬의 시작, 중지 및 상태 확인을 제어합니다.
$ rpm -ql osquery-4.8.0-1.linux.x86_64 | grep bin
/usr/bin/osqueryctl
/usr/bin/osqueryd
/usr/bin/osqueryi
$
osqueryi 대화형 프롬프트 사용
SQL 데이터베이스를 사용하는 것처럼 Osquery와 상호 작용합니다. 사실, osqueryi는 SQLite 셸의 수정된 버전입니다. osqueryi 명령을 실행하면 종종 .:로 시작하는 Osquery와 관련된 명령을 실행할 수 있는 대화형 쉘로 이동합니다.
$ osqueryi
Using a virtual database. Need help, type '.help'
osquery>
대화형 셸을 종료하려면 .quit 명령을 실행하여 운영 체제의 셸로 돌아갑니다.
osquery>
osquery> .quit
$
사용 가능한 테이블 알아보기
언급했듯이 Osquery는 데이터를 SQL 쿼리의 출력으로 사용할 수 있도록 합니다. 데이터베이스의 정보는 종종 테이블에 저장됩니다. 그러나 이름을 모르는 경우 이러한 테이블을 어떻게 쿼리할 수 있습니까? .tables 명령을 실행하여 쿼리할 수 있는 모든 테이블을 나열할 수 있습니다. 오랜 기간 Linux 사용자 또는 시스템 관리자인 경우 이 정보를 얻기 위해 운영 체제 명령을 사용했기 때문에 테이블 이름이 익숙할 것입니다.
osquery> .tables
=> acpi_tables
=> apparmor_events
=> apparmor_profiles
=> apt_sources
<< snip >>
=> arp_cache
=> user_ssh_keys
=> users
=> yara
=> yara_events
=> ycloud_instance_metadata
=> yum_sources
osquery>
개별 테이블의 스키마 확인
이제 테이블 이름을 알았으므로 각 테이블이 제공하는 정보를 볼 수 있습니다. 예를 들어, ps 명령이 이 정보를 얻기 위해 자주 사용되기 때문에 프로세스를 선택하십시오. .schema 명령 다음에 테이블 이름을 실행하여 이 테이블에 저장된 정보를 확인하십시오. 결과를 확인하려면 ps -ef 또는 ps aux를 빠르게 실행하고 출력을 테이블 내용과 비교할 수 있습니다.
osquery> .schema processes
CREATE TABLE processes(`pid` BIGINT, `name` TEXT, `path` TEXT, `cmdline` TEXT, `state` TEXT, `cwd` TEXT, `root` TEXT, `uid` BIGINT, `gid` BIGINT, `euid` BIGINT, `egid` BIGINT, `suid` BIGINT, `sgid` BIGINT, `on_disk` INTEGER, `wired_size` BIGINT, `resident_size` BIGINT, `total_size` BIGINT, `user_time` BIGINT, `system_time` BIGINT, `disk_bytes_read` BIGINT, `disk_bytes_written` BIGINT, `start_time` BIGINT, `parent` BIGINT, `pgroup` BIGINT, `threads` INTEGER, `nice` INTEGER, `is_elevated_token` INTEGER HIDDEN, `elapsed_time` BIGINT HIDDEN, `handle_count` BIGINT HIDDEN, `percent_processor_time` BIGINT HIDDEN, `upid` BIGINT HIDDEN, `uppid` BIGINT HIDDEN, `cpu_type` INTEGER HIDDEN, `cpu_subtype` INTEGER HIDDEN, `phys_footprint` BIGINT HIDDEN, PRIMARY KEY (`pid`)) WITHOUT ROWID;
osquery>
해당 지점으로 이동하려면 다음 명령을 사용하여 RPM 패키지의 스키마를 확인하고 정보를 rpm -qa 및 rpm -qi 운영 체제 명령과 비교하십시오.
osquery>
osquery> .schema rpm_packages
CREATE TABLE rpm_packages(`name` TEXT, `version` TEXT, `release` TEXT, `source` TEXT, `size` BIGINT, `sha1` TEXT, `arch` TEXT, `epoch` INTEGER, `install_time` INTEGER, `vendor` TEXT, `package_group` TEXT, `pid_with_namespace` INTEGER HIDDEN, `mount_namespace_id` TEXT HIDDEN, PRIMARY KEY (`name`, `version`, `release`, `arch`, `epoch`, `pid_with_namespace`)) WITHOUT ROWID;
osquery>
Osquery의 테이블 문서에서 자세히 알아보세요.
PRAGMA 명령 사용
스키마 정보가 너무 모호한 경우 테이블 정보를 장황한 테이블 형식으로 인쇄하는 또 다른 방법이 있습니다. 바로 PRAGMA 명령입니다. 예를 들어, PRAGMA를 사용하여 rpm_packages 테이블에 대한 정보를 멋진 형식으로 볼 것입니다.
osquery> PRAGMA table_info(rpm_packages);
이 표 형식 정보의 한 가지 이점은 쿼리하려는 필드에 집중하고 해당 필드가 제공하는 정보 유형을 볼 수 있다는 것입니다.
osquery> PRAGMA table_info(users);
+-----+-------------+--------+---------+------------+----+
| cid | name | type | notnull | dflt_value | pk |
+-----+-------------+--------+---------+------------+----+
| 0 | uid | BIGINT | 1 | | 1 |
| 1 | gid | BIGINT | 0 | | 0 |
| 2 | uid_signed | BIGINT | 0 | | 0 |
| 3 | gid_signed | BIGINT | 0 | | 0 |
| 4 | username | TEXT | 1 | | 2 |
| 5 | description | TEXT | 0 | | 0 |
| 6 | directory | TEXT | 0 | | 0 |
| 7 | shell | TEXT | 0 | | 0 |
| 8 | uuid | TEXT | 1 | | 3 |
+-----+-------------+--------+---------+------------+----+
osquery>
첫 번째 쿼리 실행
이제 테이블, 스키마 및 쿼리할 항목에서 필요한 모든 정보를 얻었으므로 첫 번째 SQL 쿼리를 실행하여 정보를 봅니다. 아래 쿼리는 시스템에 있는 사용자와 각 사용자의 사용자 ID, 그룹 ID, 홈 디렉터리 및 기본 셸을 반환합니다. Linux 사용자는 /etc/passwd 파일의 내용을 보고 grep, sed 및 awk 마술을 수행하여 이 정보를 얻을 수 있습니다.
osquery>
osquery> select uid,gid,directory,shell,uuid FROM users LIMIT 7;
+-----+-----+----------------+----------------+------+
| uid | gid | directory | shell | uuid |
+-----+-----+----------------+----------------+------+
| 0 | 0 | /root | /bin/bash | |
| 1 | 1 | /bin | /sbin/nologin | |
| 2 | 2 | /sbin | /sbin/nologin | |
| 3 | 4 | /var/adm | /sbin/nologin | |
| 4 | 7 | /var/spool/lpd | /sbin/nologin | |
| 5 | 0 | /sbin | /bin/sync | |
| 6 | 0 | /sbin | /sbin/shutdown | |
+-----+-----+----------------+----------------+------+
osquery>
대화형 모드로 전환하지 않고 쿼리 실행
osqueri 대화식 모드를 입력하지 않고 쿼리를 실행하려면 어떻게 해야 합니까? 이것은 주변에 셸 스크립트를 작성하는 경우 매우 유용할 수 있습니다. 이 경우 SQL 쿼리를 에코하고 Bash 셸에서 바로 osqueri로 파이프할 수 있습니다.
$ echo "select uid,gid,directory,shell,uuid FROM users LIMIT 7;" | osqueryi
+-----+-----+----------------+----------------+------+
| uid | gid | directory | shell | uuid |
+-----+-----+----------------+----------------+------+
| 0 | 0 | /root | /bin/bash | |
| 1 | 1 | /bin | /sbin/nologin | |
| 2 | 2 | /sbin | /sbin/nologin | |
| 3 | 4 | /var/adm | /sbin/nologin | |
| 4 | 7 | /var/spool/lpd | /sbin/nologin | |
| 5 | 0 | /sbin | /bin/sync | |
| 6 | 0 | /sbin | /sbin/shutdown | |
+-----+-----+----------------+----------------+------+
$
부팅 시 시작되는 서비스 알아보기
Osquery는 부팅 시 시작하도록 설정된 모든 서비스를 반환할 수도 있습니다. 예를 들어 startup_items 테이블을 쿼리하고 시작 시 실행되는 처음 5개 서비스의 이름, 상태 및 경로를 가져오려면 다음을 수행합니다.
osquery> SELECT name,type,status,path FROM startup_items LIMIT 5;
name = README
type = Startup Item
status = enabled
path = /etc/rc.d/init.d/README
name = anamon
type = Startup Item
status = enabled
path = /etc/rc.d/init.d/anamon
name = functions
type = Startup Item
status = enabled
path = /etc/rc.d/init.d/functions
name = osqueryd
type = Startup Item
status = enabled
path = /etc/rc.d/init.d/osqueryd
name = AT-SPI D-Bus Bus
type = Startup Item
status = enabled
path = /usr/libexec/at-spi-bus-launcher --launch-immediately
osquery>
바이너리에 대한 ELF 정보 조회
ls 바이너리에 대한 자세한 내용을 알고 싶다고 상상해 보십시오. 일반적으로 readelf -h 명령 다음에 ls 명령의 경로를 사용하여 수행합니다. Osquery로 elf_info 테이블을 쿼리하고 동일한 정보를 얻을 수 있습니다.
osquery> SELECT * FROM elf_info WHERE path="/bin/ls";
class = 64
abi = sysv
abi_version = 0
type = dyn
machine = 62
version = 1
entry = 24064
flags = 0
path = /bin/ls
osquery>
이제 osqueri를 사용하여 관심 있는 정보를 찾는 방법을 맛보았습니다. 그러나 이 정보는 엄청난 수의 테이블에 저장됩니다. 내가 쿼리한 한 시스템에는 156개의 서로 다른 테이블이 있었는데, 이는 압도적일 수 있습니다.
$ echo ".tables" | osqueryi | wc -l
156
$
일을 더 쉽게 하기 위해 다음 표로 시작하여 Linux 시스템에 대한 정보를 얻을 수 있습니다.
System information table
osquery> select * from system_info;
System limit information
osquery> select * from ulimit_info;
다양한 프로세스에 의해 열린 파일
osquery> select * from process_open_files;
시스템에서 포트 열기
osquery> select * from listening_ports;
실행 중인 프로세스 정보
osquery> select * from processes;
설치된 패키지 정보
osquery> select * from rpm_packages;
사용자 로그인 정보
osquery> select * from last;
시스템 로그 정보
osquery> select * from syslog_events;
더 알아보기
Osquery는 다양한 사용 사례를 해결하는 데 사용할 수 있는 많은 호스트 정보를 제공하는 강력한 도구입니다. 문서를 읽으면 Osquery에 대해 자세히 알아볼 수 있습니다.
https://opensource.com/article/21/6/osquery-linux
등록된 댓글이 없습니다.