Home

읽기 설정

만약 Linux에서 일을 해 왔다면, 어느 정도 시간이 지났더라도, Shell bash에 대한 질문을 스스로 던졌었다면00:01

저가 `sudo echo`를 입력할 때, sudo가 어디 있는지 알아내는 방법인가요?00:09

그 명령어를 입력하면 실행될 바이너리나 스크립트를 찾는 방법은 무엇일까요?00:15

이제까지 Linux 환경에서 작업해오시면, 'which 명령어'를 분명히 알고 계시죠?00:21

그래서 'which sudo'라고 하면, 사용자 bin 디렉토리에 있는 sudo가 나옵니다.00:27

바로 이곳에서 실행될 sudo binary 파일을 찾아냈습니다.00:32

하지만 어떻게 찾아낸 건지 궁금하시죠?00:36

'path 변수'에 설정되어 있기 때문입니다.00:39

bash에서 다른 변수와 마찬가지로, path도 하나의 변수입니다.00:41

'echo'를 이용하여 출력하면 확인할 수 있습니다.00:45

이것을 보시면 콜론으로 구분된 디렉토리 목록임을 알 수 있습니다.00:47

이 디렉토리는 Bash가 순서대로 확인하여 각 디렉토리 안에 sudo가 있는지 확인하는 곳입니다.00:52

먼저 사용자 로컬 sbin, 다음은 사용자 로컬 bin, 그 다음은 사용자 sbin, 그리고 사용자 bin, 마지막으로 루트 bin을 확인합니다.01:01

그렇게 이해되시나요?01:11

즉, 제가 실행하려고 하는 이름이 있는 것이라면 이 경우 sudo라는 것은 해당 바이너리 또는 스크립트를 반환하는 것입니다.01:12

중요한 것은 아닙니다. 단순히 실행 권한이 설정된 실행 가능한 파일이라고 하여 되는 파일을 반환하고 실행한다는 점입니다.01:23

그래서 이것이 바로 당신의 사전과 같습니다. 이것은 어디에서 찾아야 하는지 보여줍니다.01:34

잠깐 다시 한 번 살펴볼까요? sudo echo hello라고 말하면, 저가 엔터 키를 치자마자 bash는 path를 확인하고 첫 번째 것을 봅니다.01:45

만약 그곳에 sudo라는 파일이 있으면 이것을 확인하고 동일한 작업을 수행합니다. 그리고 이렇게 하여 다음 목록의 각 항목을 확인합니다.01:55

어떤 결과가 나오면, 그 작업을 중단합니다. 만약 user local bin에서 sudo를 찾아낸다면, 나머지를 확인할 필요 없이 끝나죠.02:03

which 명령어를 사용해서 실제로 어디에 있는지 알아낼 수 있습니다. 그러니 user bin이 맞는 것으로 나타나는 것은 바로 앞의02:10

가장 마지막, 혹은 두 번째 마지막 목록인 이 path와 연결된 내용이며, 이를 통해 악의적인 행위를 하는 재미있는 방법을 알려 드리겠습니다. 분명히 여러분이 모든 bash 스크립트에서 들어봤을 것입니다.02:21

시행할 때 항상 바이너리나 파일의 전체 경로를 명시해야 합니다. 왜 그런가요? 그 이유는 다음과 같습니다.02:33

이 경로 변수가 작동하는 방식과 bash가 처리하는 방식 때문에 스크립트에 작성하면 sudo를 사용하고 싶다면 user bin sudo와 같이 쓰는 거죠.02:42

단지 sudo 어떤 명령어가 아닙니다. 제가 여기 가지고 있는 것은 악의적인 sudo 명령어입니다. 이 자체로02:53

만약 sudo를 직접 입력하면, 이전에 보셨듯이 실제로는 아무런 일이 발생하지 않습니다. 꽤 심각합니다. 실행 가능한 파일이며, 제가 실행하면 스크립트가 실행되고 루트 권한으로 실행됩니다.03:02

그래서 이것은 어느 정도 문제점입니다. 하지만 자체적으로는 아무런 피해를 입히지 않습니다. 그러나 경로 변수를 편집하는 방법을 보여드리겠습니다.03:11

그리고 그때부터 문제가 발생하게 될 것을 확인할 수 있으니, 참고로 우리의 경로를 여기에 넣어보도록 하면 공간이 생기고 그리고 path에 prepend 또는 append해야 하는지 생각해 볼 수 있습니다.03:21

경로에 무언가를 추가하려면 다른 bash 변수처럼 처리합니다. path=와 같이 말합니다.03:29

그리고 예를 들어 붙이는 경우, path이고 그 다음 ':'(콜론)을 넣고 그 뒤에 어떤 디렉토리를 추가하면...03:38

그래서 엔터를 치면 지금은 그렇게 하지 않지만 path에 추가하는 방법이 이렇습니다. 끝에 뭔가를 추가하는 것이 일반적으로03:49

원하시는 일입니다. 가장 중요한 디렉토리를 최초로 검색하는 것을 재정의하고 싶지 않는 한, 예를 들어 시스템 바이너리, 사용자 로컬 바이너리, 사용자 바이너리가 아니든 어떤 것도03:58

가장 먼저 검색되기 전에 추가하는 디렉토리를 원한다면 접두사를 사용하세요.04:08

그렇기 때문에 이 작업을 하는 대신, 괜찮으세요? 경로와 함께 또 다른 콜론과 여기에 위치를 나타내는 작은 목록이 있습니다. 어떻게 말하시겠습니까? 경로가 당신의04:16

디렉토리입니다. 그러므로 이 경우, 루트(rot이 아닌 루트)에 있으므로 이것을 할 수 있는 것은 루트를 우리의 경로의 처음으로 넣는 것입니다.04:26

그래서 사용자 로컬 sbin보다 우선 검색됩니다.04:37

그래서 내가 나쁜 사람이고 이렇게 한다면, 지금부터 루트에 놓은 모든 것은 가장 먼저 찾아집니다.04:42

그러므로 내가 sudo라고 말할 때, root sudo를 찾고 어떤 의미인지 살펴보겠습니다.04:50

그러므로 내가 sudo echo hello world라고 말하면 얼마나 행복하고 자유로운 지, 무시무시한 일이 발생합니다.04:57

Bash는 처음 검색하는 경로의 가장 먼저 있는 sudo를 찾고, 그것이 /root입니다.05:07

특정 디렉토리에 있는 셸 스크립트를 실행하면 이런 일이 발생할 수 있습니다.05:13

그리고 바로 지금은 해당 파일을 실행하고 있고05:15

이것은 매우 위험한 상황입니다.05:25

너는 이 일이 너에게 일어나지 않기를 바라겠죠, 특히 루트 권한으로 작업을 수행할 때, 예를 들어 cron 테이블이나 bash 스크립트에서처럼05:29

초고급 사용자에게 의뢰될 거야.05:37

그래서 당신이 작업하는 바이너리와 스크립트의 절대 경로를 정렬에 넣어야 하는 이유가 알 수 있습니다.05:39

일상 스크립팅의05:48

음, 뭐죠? 물론 현실에서는 내 음료를 쏟는게 아니고, 네 파일들을 다 삭제하는 거니까요.05:50

나쁜 러시아식 억양 정말 미안해요, 그게 그래서에요.05:59

그렇습니다06:02

프리펜딩, 어플렌딩, 절대 경로를 왜 사용해야 하는지, 그리고 마지막으로 극도로 빠르게 이것이 어디에서 섞이고 각 새 bash 세션마다 설정되는 곳을 보여드리고 싶습니다. 그때 바로 로그인하는 것처럼06:04

그런데 로그아웃하면 이것이 다시 이전 경로로 돌아갈 것입니다. 내가 변수를 사용하고 있지 않고, 어디에든 고정 코드를 쓰지 않았기 때문에.06:13

같은 내용을 고정하는 곳은 사용자의06:24

bash 프로필이므로 여기 잠깐 살펴보면 여기에 어떤 것이 추가되었는지 볼 수 있습니다.06:32

그리고 이곳에서 루트가 새로운 bash 세션을 열 때마다 루트 경로를 편집하고 싶다면06:41

홈/bin이 추가되어 루트가 새로운 bash 세션을 열 때마다 이 경로 변수에는 원래 설정된 값과 이것:06:50

콜론 구분자, 그리고 홈 디렉토리 즉 /root 이 경우 /bin이 포함됩니다. 그러므로 내 홈 디렉토리에 bin 디렉토리를 만들고07:01

그리고 거기에 파일을 넣으면 이미 경로에 있는 나머지 것들 뒤에서 검색될 것입니다. 따라서 이게 한 사용자에게 맞게 커스터마이징하는 방법입니다.07:10

일부 프로그래밍 도구나 다른 사용자가 아닌 특정 사용자만 찾아야 하는 것들이 있을 때 유용합니다.07:18

하지만 다른 사용자에 의해서는 필요하지 않습니다.07:27

그것을 사용자의 bash underscore 프로필에 넣으세요.07:28

사용자 홈 디렉토리 내에 숨겨진 파일이죠.07:31

하지만 이 원본 경로가 실제로 오는 곳은 등 프로필 파일일 것입니다.07:33

그리고 경로에서 몇 가지 변경 사항이 이루어지는 것을 볼 수 있습니다. 어떤 내용이 추가되고 마지막으로는07:43

그것과 다른 여러 정보와 함께 내보내집니다. 따라서 bash가 시작될 때, 이를 평가하고 내보냅니다.07:53

여러 정보와 함께 내보내집니다. 그래서 경로가 처음으로 설정되는 곳입니다. 또한 /etc/profile이 있고 여기에 여러 스크립트가 있습니다. 각각은 bash 시작 시 설정된 변수 중 일부를 변경할 수도 있습니다.08:01

여기에서 가장 중요하게 기억해야 할 것은 특정 사용자의 경로와 같은 것을 변경하는 작업이 있다면 해당 사용자의 홈 디렉터리에서 수행하라는 것입니다. 즉, 제 경우에는 home/Dave와 bash_profile에 있습니다.08:14

시스템에 아직 Dave 사용자가 없지만, 그렇게 하기 위해 어떤 일을 하는지 알고 싶다면?08:24

근처에 있는 모든 사용자에게 똑같은 작업을 수행하고 싶을 때, root를 제외하면 /etc/profile에서 할 수 있습니다.08:33

그리고 마지막으로 root를 제외한 모든 일반 사용자의 경우, 여기서 경로를 변경할 수 있습니다.08:41

그리고 보실 수 있듯이, 이 Export 경로 바로 앞에는 이름과 날짜를 포함한 주석을 넣는 것이 좋습니다. 다른 사람들과 함께 작업하기 때문에 좋은 습관이라고 생각합니다. 그리고 여기서 'path'에 대해 정의할 수 있습니다: 'path'가 '=' 로 시작하고 '$PATH'와 ':'로 연결된 원하는 값을 추가하면 됩니다.08:49

그리고 이렇게 하면 'path' 변수가 검색되고 설정됩니다.08:57

and then whatever you want to append that's it for path it's important it's getting looked up and set and09:05

경로에 들어가기 위해서는 이렇게 해야 합니다. 그런 다음 경로를 콜론 기호와 함께 설정할 수 있습니다. 예를 들어, 'Dollar sign path colon'과 원하는 추가 문자열을 입력하면 됩니다.09:14

그때부터 경로 변수에 저장된 값이 확인되고 사용될 것입니다.09:23

AI Summary

이 영상은 Linux 환경에서 sudo 명령어를 사용할 때 발생할 수 있는 보안 위험과 환경 변수 PATH를 관리하는 방법을 자세히 설명해요. sudo 명령어는 PATH 변수에 등록된 실행 파일 중에서 가장 먼저 발견되는 파일을 실행하는데, 악의적인 사용자가 PATH에 악성 코드를 등록하면 루트 권한으로 실행될 수 있거든요. 이 문제를 해결하기 위해 which 명령어로 sudo 실행 파일의 위치를 확인하고, 절대 경로를 사용하여 sudo 명령어를 실행하는 것이 중요하며, .bash_profile이나 /etc/profile에서 PATH 변수를 적절히 관리해야 한다는 내용을 담고 있어요.

Key Highlights

  • `sudo` 명령어 실행 시 `PATH` 변수를 통해 실행 파일이 결정되고, 악성 코드가 포함될 위험이 있다.
  • `which sudo` 명령어를 사용하여 `sudo` 실행 파일의 경로를 확인할 수 있다.
  • `PATH` 변수를 사용자별 또는 시스템 전체 환경 설정 파일에서 수정할 수 있다.
  • 스크립트 내에서 `sudo`를 사용할 때는 전체 경로를 명시하여 악성 코드 위험을 방지해야 한다.
  • `PATH` 변수의 순서가 `sudo` 실행 파일 선택에 영향을 미치므로 주의해야 한다.

Related Videos