분류 기타

데이터베이스처럼 Linux 운영 체제 쿼리

컨텐츠 정보

  • 조회 812 (작성일 )

본문

데이터베이스 스타일 쿼리를 사용하여 시스템 정보를 쉽게 얻을 수 있습니다.


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에는 두 가지 주요 구성 요소가 있습니다.


  • osqueri는 대화형 SQL 쿼리 콘솔입니다. 수퍼유저 권한이 필요하지 않은 독립 실행형 유틸리티입니다(해당 액세스 수준이 필요한 테이블을 쿼리하지 않는 한).
  • osqueryd는 설치된 호스트에 대한 모니터링 데몬과 같습니다. 이 데몬은 인프라에서 정보를 수집하기 위해 정기적으로 쿼리를 실행하도록 예약할 수 있습니다.

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 helptype '.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