|  Questions 
              and Answers
 Amy Rich
              Back in the August issue of Sys Admin, someone asked a 
              question about how to read a file backwards, and I provided a handy 
              one-liner in Perl. Thanks to Tillman Hodgson for pointing out that 
              there is also a GNU program called tac (cat spelled backwards) that 
              does the same thing. Also thanks to Tom Payerle for pointing out 
              the program rev, which prints lines from right to left.
              Q I have our Sendmail server configured 
              with RBL and DUL, but these lists are not complete 
              enough to catch all the spam that we receive. We get nothing but 
              spam, for instance, from several top-level country domains, and 
              I'm trying to block those with the access_db feature. 
              I'm having some difficulty blocking a TLD and all of its subdomains, 
              however. I can successfully block the addresses in the access.db 
              when I have an exact match. For example, the following entry works:
              
             
host.sub.domain            REJECT
I obviously don't want to go through and match every host, so 
            I was trying to write a match for the entire TLD:  
             
.domain                    REJECT
When I test my access rules with sendmail -bt -v it doesn't 
            seem to work:  
             
> /map access .domain
map_lookup: access (.domain) returns REJECT (0)
which is fine, but:  
             
> /map access sub.domain
map_lookup: access (sub.domain) no match (0)
which fails. How do I correctly block an entire TLD?  A  Your access.db entry is syntactically 
              incorrect and should look like the following:
              
             
domain                     REJECT
You don't want the leading '.' on the domain when you're 
            trying to block the whole domain. When lookups are done against the 
            access database, they're done in tokens, separated by dots. When 
            the lookup for host.sub.domain is done, it then iterates through, 
            taking off a token and a dot each time:  
             
host.sub.domain
sub.domain
domain
Your other issue is that you're trying to validate your matches 
            in testing mode with /map. This won't work because of 
            the above-mentioned recursive token removal. This happens as part 
            of the check_* rulesets, not the map lookup. The check_* 
            rulesets will do multiple map lookups until the TLD is reached.  Q I just installed Solaris 8 on 
              my E450 and flashed the OBP. Now whenever I try to boot the machine, 
              it insists on booting off the network instead of the disk. This, 
              of course, fails because I don't have a network boot server. 
              I've set the boot device to disk and tried again, but 
              it still tries to boot from the network. Why won't my machine 
              boot from the disk that Solaris is installed on?
              A  Suns usually boot from the network 
              for diagnostic purposes. Your machine may not see the disk, may 
              not have the boot device set correctly, or may just be tagged 
              to do a diagnostic boot. First, make sure that the machine can actually 
              see the disk device. At the OK prompt, type the following (assuming 
              you have SCSI disks):
              
             
probe-scsi-all
If you don't see your disk, verify that the disk is connected 
            properly and is actually spinning up. If you still can't see 
            your disk, you may have damaged your disk or controller (or some other 
            piece of hardware) that you'll need to replace.  If you can see your disk with the probe, verify that the boot 
              device and any aliases are set correctly. You can see the values 
              of each variable by using printenv from the ok prompt. 
              Verify that boot-device is set to boot from disk first. 
              An example boot device line looks like the following:
              
             
boot-device=disk net
Verify that disk is actually correctly aliased to your boot 
            disk. The address of your boot device will look different depending 
            on what sort of hardware you have in your machine. You can use the 
            command devalias from the ok prompt to view your aliases. 
            On a PCI bus, the disk alias may look something like the following:  
             
/pci@1f,0/pci@1/scsi@1/sd@0,0:a
You may also want to try booting directly from the disk path if you 
            suspect problems with the NVRAM aliases. If you need to reset the 
            alias, you can use the nvalias command, and be sure to set 
            use-nvramrc? to true.  Most machines will have diag-device=net, so verify that 
              the diag-switch is set to false:
              
             
diag-switch?=false
If you still can't get your machine to boot from the disk, you 
            may have hardware issues. If you have a Sun contract, call them and 
            have them help. If you don't have a contract, Sun also offers 
            per-incident pricing.  Q I've just been handed the 
              systems administration tasks at work, and I'm not really all 
              that UNIX-savvy yet. Right now I'm trying to change ftpd 
              so that all the incoming files have the permissions -rwxrwxrwx 
              instead of -rw-rw-rw. I've tried changing both root 
              and ftp's umask to 0, but this doesn't seem to 
              help. How can I change the default incoming ftp permissions?
              A  To help you understand why your 
              umask command didn't work, let's start with a bit of information 
              about file modes, file creation modes, and umask. UNIX file permissions 
              have two sorts of representations (letters, as you listed) and octal 
              numbers. To understand the umask, it's important that you understand 
              octal permissions.
              With standard UNIX permissions (no extended ACLs), there are three 
              catagories of permissions: user, group, and other. In both the octal 
              and alphabetic representations, the categories are read from left 
              to right. For each category, you can set three basic permission 
              types: read, write, and execute. (We'll skip SUID, SGID, and 
              other special permissions for now.) Using the alphabetic output, 
              read is represented by the letter r, write by w, and execute by 
              x. Using the octal output, read is represented by the number 4, 
              write by the number 2, and execute by the number 1. To translate 
              your desired permissions from alphabetic to octal, you add up the 
              numbers for each category (user, group, and other):
              
             
-rwxrwxrwx  is equivalent to 0777  (4+2+1 4+2+1 4+2+1)
-rw-rw-rw-  is equivalent to 0666  (4+2 4+2 4+2)
-rw-r--r--  is equivalent to 0644  (4+2 4 4)
The default file creation mode for files in UNIX is 0666. For directories, 
            the default creation mode is 0777. The umask is another octal number 
            that is subtracted from the default creation permission. If you have 
            a umask of 2 (you can also pad it out with leading zeros so the umask 
            becomes 0002), you get the following:  
             
directories     0777           drwxrwxrwx
- umask         0002         - --------w-
____________________           __________            
creation mode   0775           drwxrwxr-x
files           0666           -rw-rw-rw- 
- umask         0002         - --------w-
____________________           __________            
creation mode   0664           -rw-rw-r--
If you have a umask of 22 (or 0022), then you get file creation modes 
            of 0644 (-rw-r--r--), and directory creation modes of 0755 
            (drwx-r--r--). The "d" in the first position of the 
            alphabetic listings above denotes that the entry in is a directory.  Your problem with ftp is that all ftp file uploads start off with 
              the creation permission for 0666. Umask cannot add permissions, 
              only take them away. You'll never be able to upload files with 
              the execute bit set by using ftp. There are a couple ways to get 
              around this. You can use something like scp (part of ssh) 
              to upload files instead of ftp. Scp will subtract the destination 
              user's umask from the existing permissions on the remote machine. 
              So, if you scp a file with the permissions of 0775 from a 
              remote machine and your umask is 22, you will then have a resulting 
              file on the local machine of 0755.
              As an aside, root's umask should be something fairly restrictive, 
              such as 22, so that random people on the system cannot write to 
              files owned by root.
              Taking a different approach, you can also run a cron job to change 
              the permissions of the uploaded files on a regular basis if they 
              are in a known location. Beware when adding the execute bit to uploaded 
              files, though -- malicious users can upload trojans and when 
              you change the permissions on them, people may unwittingly execute 
              those trojan binaries. 
              Amy Rich, president of the Boston-based Oceanwave Consulting, 
              Inc. (http://www.oceanwave.com), has been a UNIX systems 
              administrator for more than five years. She received a BSCS at Worcester 
              Polytechnic Institute, and can be reached at: arr@oceanwave.com.
           |