Cách liệt kê tất cả các tệp được sử dụng trong quá trình khởi động Linux


7

Tôi muốn lấy danh sách các tệp được sử dụng trong quá trình khởi động Linux. Chúng tôi đang phát triển hệ thống doanh nghiệp được bảo vệ dựa trên RHEL 6.4. Tính toàn vẹn của các tệp được chỉ định sẽ được kiểm tra bởi một phần cứng đặc biệt.

Vì vậy, câu hỏi là - làm thế nào để có được danh sách các tệp này (với các phụ thuộc được giải quyết đến từ các dịch vụ khởi động và trình nền khác nhau).


6
Có lẽ bạn có thể sử dụng find với tùy chọn atime. Nhưng ... nếu bạn muốn điều đó thì bạn nên biết hệ thống của bạn đang làm gì. Bạn luôn có thể đưa ra một câu hỏi trực tiếp cho Red Hat.
jirib

Tôi đã giải quyết vấn đề tương tự trên OpenBSD và tôi phát hiện ra rằng tôi cũng cần tệp master.passwd (bóng trên Linux), vì một người dùng khởi động có thể yêu cầu mật khẩu root trước khi lấy shell của bạn. Điều đó nói rằng ... bạn phải biết tất cả các chi tiết về cách hệ thống khởi động với tất cả các khả năng.
jirib

Thời gian truy cập là không có giải pháp thích hợp cho việc này. Bạn nên để nhiệm vụ này cho Kernel, vì đó là cơ sở duy nhất trong các hệ thống (không phải hệ thống) có khả năng thực sự theo dõi tất cả các tệp đã mở.
Elias Probst

1
Đầu tiên, xác định những gì bạn muốn "khởi động" để bao gồm. Có phải nó chỉ đang tải kernel và mount rootfs? Sau đó, initramfs và bất cứ thứ gì sử dụng grub sẽ là tất cả những gì bạn cần xem xét. Có phải tất cả mọi thứ cho đến khi nhắc nhở đăng nhập? Tất cả mọi thứ cho đến khi màn hình đăng nhập X? Có thể có một số loại hệ thống khởi động sớm có sẵn, nhưng nếu không, có lẽ bạn sẽ phải chạy hệ thống trên máy ảo hoặc trình gỡ lỗi kernel để xem mọi tệp mà nó truy cập.
Đánh dấu Plotnick

1
Would kiểm toán là một lựa chọn hay rằng sẽ bắt đầu quá muộn trong khi khởi động?
jippie

Câu trả lời:


7

Thiết lập hệ thống con kiểm toán để ghi lại các cuộc gọi đến open.

auditctl -a exit,always -S open,openat,creat,execve

Làm điều đó từ initramfs, để quy tắc được đặt ra khi hệ thống chính ( /sbin/inittrên hệ thống tập tin gốc thực sự) khởi động.

Lưu ý rằng những gì bạn đề xuất sẽ không mang lại bất kỳ bảo mật thực sự nào trên một thiết lập thông thường. Bất cứ ai có thể thay thế các tệp này bằng các phiên bản khác đều có quyền truy cập root và cũng có thể cung cấp dữ liệu không có thật cho hệ thống ghi nhật ký.

Nếu phương tiện khởi động được bảo vệ bên ngoài để root không thể sửa đổi nó (ví dụ: vì nó chỉ đọc hoặc dưới sự kiểm soát độc quyền của bộ tải khởi động an toàn) và nếu tải mô-đun hạt nhân bị chặn, thì việc đo các tệp có thể đáng tin cậy nếu nó được thực hiện đúng . Tuy nhiên, nếu tất cả những gì bạn đang thực hiện với các biện pháp là so sánh chúng với các giá trị tham chiếu, thì điều này khó khăn và kém hiệu quả hơn so với sử dụng hệ thống tệp gốc được bảo vệ toàn vẹn (nghĩa là trong thực tế trên dmcrypt, với Trusted Grub cho bộ tải khởi động).


1
Bạn có thể muốn đăng nhập openatexecvelà tốt (ít nhất). Bây giờ nó cũng phụ thuộc có nghĩa là gì sử dụngtập tin , vì nó có thể là bạn cũng cần phải đăng nhập creat, truncate, access, stat, mkdir, connect...
Stéphane Chazelas

Bạn có thể vui lòng cung cấp một số giải thích bổ sung cho các phương pháp bạn đã đề cập? Trường hợp dòng mã này nên được đặt? Tôi có nên giải nén /boot/initramfs-xxxxx.img cấu hình lại nó và đưa nó trở lại / boot như lưu trữ không?
Vitaly Isaev

1
@VitalyIsaev Tôi không biết cấu trúc initramfs của Redhat. Nếu đó là bất cứ thứ gì như Debian, bạn sẽ thêm một tập lệnh ở đâu đó bên dưới /usr/share/initramfs-tools(đường dẫn có thể khác trên RH), sau đó xây dựng lại các initramfs (trên Debian update-initramfs) và khởi động lại.
Gilles 'SO- ngừng trở nên xấu xa'

1

Một nơi khởi đầu tốt sẽ là /etc/rci.dnơi imột con số đại diện cho runlevel bạn đang khởi động. Ví dụ: nếu máy chủ của bạn không đầu, ithông thường sẽ là 3. Nhìn bên dưới /etc/rc3.dsẽ hiển thị những dịch vụ nào đang được khởi động khi bạn khởi động vào runlevel 3.


Cảm ơn bạn! Nhưng các bước tiếp theo là gì? Làm cách nào tôi có thể theo dõi hoạt động của các dịch vụ được chỉ định trong /etc/rc.d (= lấy danh sách các tệp được chúng truy cập)?
Vitaly Isaev

RHEL6 cũng mới bắt đầu dựa trên ...
jirib

@JiriXichtkniha Xin hãy sửa lỗi cho tôi nếu tôi sai, nhưng upstartcác hệ thống init không dựa trên cơ sở cũng sử dụng /etc/rci.dlược đồ thư mục?
Joseph R.

1
Vâng, họ có khả năng tương thích di sản khi họ có "hook" để gọi các tập lệnh SysV :)
jirib

1

Đảm bảo atimeđược bật cho hệ thống tập tin gốc và khởi động trong kernel của bạn (hoặc noatimechưa được đặt), sau khi khởi động, bạn có thể sử dụng statđể kiểm tra thời gian truy cập cho mỗi tệp và xem những tệp nào được truy cập trong khi khởi động.


Bạn có thể vui lòng giải thích, làm thế nào tôi có thể làm điều đó? Fstab của tôi không có tùy chọn buổi trưa nhưng thời gian truy cập vẫn không được ghi vào siêu dữ liệu tệp hệ thống
Vitaly Isaev

1

Nhờ hỗ trợ của RHEL, giải pháp rõ ràng đã được phát hiện. Nó dựa trên việc sử dụng mô-đun kernel systemtap. Trích dẫn từ đây để tránh thối liên kết. Và cảm ơn bạn một lần nữa cho tất cả các lời khuyên của bạn :)

Tôi thậm chí không thể tưởng tượng rằng systemtap có thể bắt đầu ngay cả trước tập lệnh init và theo dõi quá trình khởi động. Tôi rất đánh giá cao Hỗ trợ Red Hat và cá nhân Pushpendra Chavan đã giúp đỡ với công cụ hoàn hảo này (tiếc là tôi không biết các nhà phát triển phương pháp này chính xác - nếu không tôi sẽ ghi nhận họ ngay từ đầu).

Vì vậy, chúng ta cần tạo hai tập lệnh đơn giản:

bootinit.sh:

#!/bin/sh


# Use tmpfs to collect data
/bin/echo "Mounting tmpfs to /tmp/stap/data"
/bin/mount -n -t tmpfs -o size=40M none /tmp/stap/data

# Start systemtap daemon & probe
/bin/echo "Loading bootprobe2.ko in the background. Pid is :"
/usr/bin/staprun \
    /root/bootprobe2.ko \
    -o /root/bootprobe2.log -D

# Give daemon time to start collecting...
/bin/echo "Sleeping a bit.."
sleep 5

# Hand off to real init
/bin/echo "Starting."
exec /sbin/init 3

bootprobe2.1.stpđược viết bằng ngôn ngữ kịch bản hệ thống nhúng:

global ident

function get_usertime:long() {
  return task_utime() + @cast(task_current(), "task_struct", "kernel<linux/sched.h>")->signal->utime;
}

function get_systime:long() {
 return task_stime() + @cast(task_current(), "task_struct", "kernel<linux/sched.h>")->signal->stime;
}

function timestamp() {
  return sprintf("%d %s", gettimeofday_s(), ident[pid()])
}

function proc() {
  return sprintf("%d \(%s\)", pid(), execname())
}  

function push(pid, ppid) {
   ident[ppid] = indent(1)
   ident[pid] = sprintf("%s", ident[ppid])
}

function pop(pid) {
  delete ident[pid]
} 

probe syscall.fork.return {
  ret = $return
  printf("%s %s forks %d  \n", timestamp(), proc(), ret)
  push(ret, pid())
}

probe syscall.execve {
  printf("%s %s execs %s \n", timestamp(), proc(), filename)
}

probe syscall.open {
  if ($flags & 1) {
    printf("%s %s writes %s \n", timestamp(), proc(), filename)
  } else {
    printf("%s %s reads %s \n", timestamp(), proc(), filename)
  }
} 

probe syscall.exit {
  printf("%s %s exit with user %d sys %d \n", timestamp(), proc(), get_usertime(), get_systime())
  pop(pid())
}
<linux sched.h=""><linux sched.h="">
</linux></linux>

Để nhận được danh sách các tệp được truy cập trong quá trình khởi động ở định dạng nhật ký systemtap, chúng ta nên thực hiện như sau:

Tải xuống và cài đặt các phiên bản systemtapkernel debuginfogói được đặt tên TÀI SẢN (Tôi đã được cung cấp liên kết này , nhưng bạn nên sử dụng phiên bản này tốt hơn nếu bạn sử dụng CentOS);

Tạo /tmp/stap/tmp/stap/data

mkdir -p /tmp/stap/data

Đặt bootprobe2.1.stpbootinit.shvào /rootvà làm cho chúng có thể thực thi được: chmod + x / root / boot *

Chỉnh sửa bootinit.shvà thay đổi 'exec / sbin / init 3' thành 'exec / sbin / init 5' nếu 5 là runlevel mặc định của bạn.

Tạo mô-đun .ko từ bootprobe2.stp

 cd /root
 stap bootprobe2.1.stp -m bootprobe2 -p4

Khởi động lại.

Dừng lại grub(nhấn Esc hoặc Shift) và nhấn 'a' trên kernel mặc định. Ở cuối dòng kernel, nhập dòng sau và nhấn enter:

init=/root/bootinit.sh,

Khởi động bình thường sẽ tiếp tục. Sau khi đăng nhập, killcác stapioquy trình, sao chép bootprobe2.logra khỏi tmpfs /tmp/stap/datathư mục và unmount nó.

killall stapio
cp /tmp/stap/data/bootprobe2.log /tmp/stap/
umount /tmp/stap/data  

Bây giờ hãy kiểm tra tệp /tmp/stap/bootprobe2.logtệp để biết danh sách tất cả các tệp được đọc trong khi khởi động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.